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

Skip to content
Snippets Groups Projects
Commit 12cfbe63 authored by Michael KRISPER's avatar Michael KRISPER
Browse files

added tests for air drag, began to implement air drag calculation

parent 7309a9c0
No related branches found
No related tags found
No related merge requests found
......@@ -24,6 +24,7 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PT/@EntryIndexedValue">PT</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RP/@EntryIndexedValue">RP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SI/@EntryIndexedValue">SI</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WHTC/@EntryIndexedValue">WHTC</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FBLOCK_005FSCOPE_005FCONSTANT/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FBLOCK_005FSCOPE_005FVARIABLE/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FCONSTRUCTOR/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
......
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.Models.SimulationComponent.Impl;
......@@ -20,6 +22,7 @@ namespace TUGraz.VectoCore.Models.Declaration
private PneumaticSystem _pneumaticSystem;
private SteeringPump _steeringPump;
private WHTCCorrection _whtcCorrection;
private AirDrag _airDrag;
public static Wheels Wheels
{
......@@ -85,6 +88,11 @@ namespace TUGraz.VectoCore.Models.Declaration
get { return Instance()._whtcCorrection ?? (Instance()._whtcCorrection = new WHTCCorrection()); }
}
public static AirDrag AirDrag
{
get { return Instance()._airDrag ?? (Instance()._airDrag = new AirDrag()); }
}
public static int PoweredAxle()
{
return 1;
......@@ -214,4 +222,75 @@ namespace TUGraz.VectoCore.Models.Declaration
}
}
}
internal class AirDrag : LookupData<VehicleCategory, double>
{
private const string ResourceId = "TUGraz.VectoCore.Resources.Declaration.VCDV.parameters.csv";
public AirDrag()
{
ParseData(ReadCsvResource(ResourceId));
}
protected override void ParseData(DataTable table)
{
// todo: constant!!
var vWind = 3.SI().Kilo.Meter.Per.Hour.Cast<MeterPerSecond>();
// todo: get from vehicle or move whole procedure to vehicle
var cdA0Actual = 0;
Data.Clear();
foreach (DataRow row in table.Rows) {
var cat = row.Field<string>("Parameters");
var values = new { a1 = row.ParseDouble("a1"), a2 = row.ParseDouble("a2"), a3 = row.ParseDouble("a3") };
var betas = new List<double>();
var deltaCdAs = new List<double>();
for (var beta = 0; beta <= 12; beta++) {
betas.Add(beta);
var deltaCdA = values.a1 * beta + values.a2 * beta * beta + values.a3 * beta * beta * beta;
deltaCdAs.Add(deltaCdA);
}
var cdX = new List<double> { 0 };
var cdY = new List<double> { 0 };
for (var vVeh = 60; vVeh <= 100; vVeh += 5) {
var cdASum = 0.0;
for (var alpha = 0; alpha <= 180; alpha += 10) {
var vWindX = vWind * Math.Cos(alpha * Math.PI / 180);
var vWindY = vWind * Math.Sin(alpha * Math.PI / 180);
var vAirX = vVeh + vWindX;
var vAirY = vWindY;
var vAir = VectoMath.Sqrt<MeterPerSecond>(vAirX * vAirX + vAirY * vAirY);
var beta = Math.Atan((vAirY / vAirX).Double()) * 180 / Math.PI;
var k = 1;
if (betas.First() < beta) {
k = 0;
while (betas[k] < beta && k < betas.Count) {
k++;
}
}
var deltaCdA = VectoMath.Interpolate(betas[k - 1], betas[k], deltaCdAs[k - 1], deltaCdAs[k], beta);
var cdA = cdA0Actual + deltaCdA;
var share = 10 / 180;
if (vVeh == 0 || vVeh == 180) {
share /= 2;
}
cdASum += share * cdA * (vAir * vAir / (vVeh * vVeh)).Double();
}
cdX.Add(vVeh);
cdY.Add(cdASum);
}
cdY[0] = cdY[1];
}
}
}
}
\ No newline at end of file
......@@ -15,7 +15,7 @@ namespace TUGraz.VectoCore.Utils
{
static Newton()
{
Constructors.Add(typeof (Newton), val => new Newton(val));
Constructors.Add(typeof(Newton), val => new Newton(val));
}
[JsonConstructor]
......@@ -31,7 +31,7 @@ namespace TUGraz.VectoCore.Utils
{
static Radian()
{
Constructors.Add(typeof (Radian), val => new Radian(val));
Constructors.Add(typeof(Radian), val => new Radian(val));
}
[JsonConstructor]
......@@ -43,7 +43,7 @@ namespace TUGraz.VectoCore.Utils
{
static MeterPerSquareSecond()
{
Constructors.Add(typeof (MeterPerSquareSecond), val => new MeterPerSquareSecond(val));
Constructors.Add(typeof(MeterPerSquareSecond), val => new MeterPerSquareSecond(val));
}
protected MeterPerSquareSecond(double val) : base(new SI(val).Meter.Per.Square.Second) {}
......@@ -53,7 +53,7 @@ namespace TUGraz.VectoCore.Utils
{
static Second()
{
Constructors.Add(typeof (Second), val => new Second(val));
Constructors.Add(typeof(Second), val => new Second(val));
}
[JsonConstructor]
......@@ -64,7 +64,7 @@ namespace TUGraz.VectoCore.Utils
{
static Meter()
{
Constructors.Add(typeof (Meter), val => new Meter(val));
Constructors.Add(typeof(Meter), val => new Meter(val));
}
protected Meter(double val) : base(new SI(val).Meter) {}
......@@ -74,7 +74,7 @@ namespace TUGraz.VectoCore.Utils
{
static Ton()
{
Constructors.Add(typeof (Ton), val => new Ton(val));
Constructors.Add(typeof(Ton), val => new Ton(val));
}
[JsonConstructor]
......@@ -86,7 +86,7 @@ namespace TUGraz.VectoCore.Utils
{
static Kilogram()
{
Constructors.Add(typeof (Kilogram), val => new Kilogram(val));
Constructors.Add(typeof(Kilogram), val => new Kilogram(val));
}
[JsonConstructor]
......@@ -97,7 +97,7 @@ namespace TUGraz.VectoCore.Utils
{
static SquareMeter()
{
Constructors.Add(typeof (SquareMeter), val => new SquareMeter(val));
Constructors.Add(typeof(SquareMeter), val => new SquareMeter(val));
}
[JsonConstructor]
......@@ -108,7 +108,7 @@ namespace TUGraz.VectoCore.Utils
{
static CubicMeter()
{
Constructors.Add(typeof (CubicMeter), val => new CubicMeter(val));
Constructors.Add(typeof(CubicMeter), val => new CubicMeter(val));
}
[JsonConstructor]
......@@ -119,7 +119,7 @@ namespace TUGraz.VectoCore.Utils
{
static KilogramSquareMeter()
{
Constructors.Add(typeof (KilogramSquareMeter), val => new KilogramSquareMeter(val));
Constructors.Add(typeof(KilogramSquareMeter), val => new KilogramSquareMeter(val));
}
[JsonConstructor]
......@@ -130,7 +130,7 @@ namespace TUGraz.VectoCore.Utils
{
static KilogramPerWattSecond()
{
Constructors.Add(typeof (KilogramPerWattSecond), val => new KilogramPerWattSecond(val));
Constructors.Add(typeof(KilogramPerWattSecond), val => new KilogramPerWattSecond(val));
}
[JsonConstructor]
......@@ -141,7 +141,7 @@ namespace TUGraz.VectoCore.Utils
{
static Watt()
{
Constructors.Add(typeof (Watt), val => new Watt(val));
Constructors.Add(typeof(Watt), val => new Watt(val));
}
[JsonConstructor]
......@@ -162,7 +162,7 @@ namespace TUGraz.VectoCore.Utils
{
static PerSecond()
{
Constructors.Add(typeof (PerSecond), val => new PerSecond(val));
Constructors.Add(typeof(PerSecond), val => new PerSecond(val));
}
[JsonConstructor]
......@@ -173,7 +173,7 @@ namespace TUGraz.VectoCore.Utils
{
static MeterPerSecond()
{
Constructors.Add(typeof (MeterPerSecond), val => new MeterPerSecond(val));
Constructors.Add(typeof(MeterPerSecond), val => new MeterPerSecond(val));
}
[JsonConstructor]
......@@ -191,7 +191,7 @@ namespace TUGraz.VectoCore.Utils
{
static RoundsPerMinute()
{
Constructors.Add(typeof (RoundsPerMinute), val => new RoundsPerMinute(val));
Constructors.Add(typeof(RoundsPerMinute), val => new RoundsPerMinute(val));
}
[JsonConstructor]
......@@ -203,7 +203,7 @@ namespace TUGraz.VectoCore.Utils
{
static NewtonMeter()
{
Constructors.Add(typeof (NewtonMeter), val => new NewtonMeter(val));
Constructors.Add(typeof(NewtonMeter), val => new NewtonMeter(val));
}
[JsonConstructor]
......@@ -237,8 +237,8 @@ namespace TUGraz.VectoCore.Utils
public static T Create(double val)
{
RuntimeHelpers.RunClassConstructor(typeof (T).TypeHandle);
return Constructors[typeof (T)](val);
RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle);
return Constructors[typeof(T)](val);
}
protected SIBase(Type type, Func<double, T> constructor)
......@@ -553,6 +553,19 @@ namespace TUGraz.VectoCore.Utils
return new SI(Math.Abs(Val), this);
}
/// <summary>
/// Returns the absolute value.
/// </summary>
public SI Sqrt()
{
var si = ToBasicUnits();
var numerator = si.Numerator.Where((u, i) => i % 2 == 0);
var denominator = si.Denominator.Where((u, i) => i % 2 == 0);
var root = new SI(Math.Sqrt(si.Val), numerator, denominator);
Contract.Requires(root * root == this);
return root;
}
#region Unit Definitions
/// <summary>
......
......@@ -24,6 +24,15 @@ namespace TUGraz.VectoCore.Utils
return ((xint - x1) * (y2 - y1) / (x2 - x1) + y1).Cast<TResult>();
}
/// <summary>
/// Linearly interpolates a value between two points.
/// </summary>
public static double Interpolate(double x1, double x2, double y1, double y2, double xint)
{
return ((xint - x1) * (y2 - y1) / (x2 - x1) + y1);
}
/// <summary>
/// Returns the absolute value.
/// </summary>
......@@ -55,5 +64,10 @@ namespace TUGraz.VectoCore.Utils
{
return c1.CompareTo(c2) >= 0 ? c1 : c2;
}
public static T Sqrt<T>(SI si) where T : SIBase<T>
{
si.Sqrt().Cast<T>();
}
}
}
\ No newline at end of file
......@@ -97,8 +97,19 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
}
[TestMethod]
public void VCDVTest()
public void AirDragTest()
{
var airDrag = DeclarationData.AirDrag;
//declaration
var Categories = Enum.GetValues(typeof(VehicleCategory)).Cast<VehicleCategory>().ToArray();
//todo: insert real test values
var expectedForCategory = new[] { 0, 0, 0, 0, 0 };
for (var i = 0; i < Categories.Length; i++) {
Assert.AreEqual(expectedForCategory[i], airDrag.Lookup(Categories[i]));
}
Assert.Inconclusive();
}
......
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