Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

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

[VECTO-278] crosswind correction up to 130km/h

parent 4b0b0ff1
No related branches found
No related tags found
No related merge requests found
......@@ -278,6 +278,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdaper
public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> GetDeclarationAirResistanceCurve(
VehicleCategory vehicleCategory, SquareMeter aerodynamicDragAera)
{
const int startSpeed = 60;
const int maxSpeed = 130;
const int speedStep = 5;
const int maxAlpha = 180;
const int alphaStep = 10;
var values = DeclarationData.AirDrag.Lookup(vehicleCategory);
var points = new List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> {
new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
......@@ -285,22 +292,24 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdaper
EffectiveCrossSectionArea = 0.SI<SquareMeter>()
}
};
for (var speed = 60; speed <= 100; speed += 5) {
for (var speed = startSpeed; speed <= maxSpeed; speed += speedStep) {
var vVeh = speed.KMPHtoMeterPerSecond();
var cdASum = 0.0.SI<SquareMeter>();
for (var alpha = 0; alpha <= 180; alpha += 10) {
for (var alpha = 0; alpha <= maxAlpha; alpha += alphaStep) {
var vWindX = Physics.BaseWindSpeed * Math.Cos(alpha.ToRadian());
var vWindY = Physics.BaseWindSpeed * Math.Sin(alpha.ToRadian());
var vAirX = vVeh + vWindX;
var vAirY = vWindY;
// var vAir = VectoMath.Sqrt<MeterPerSecond>(vAirX * vAirX + vAirY * vAirY);
var beta = Math.Atan((vAirY / vAirX).Value()).ToDegree();
var deltaCdA = ComputeDeltaCd(beta, values);
var cdA = aerodynamicDragAera + deltaCdA;
var degreeShare = ((alpha != 0 && alpha != 180) ? 10.0 / 180.0 : 5.0 / 180.0);
var degreeShare = (double)alphaStep / maxAlpha;
if (alpha == 0 || alpha == maxAlpha)
degreeShare /= 2;
// cdASum += degreeShare * cdA * (vAir * vAir / (vVeh * vVeh)).Cast<Scalar>();
cdASum += degreeShare * cdA * ((vAirX * vAirX + vAirY * vAirY) / (vVeh * vVeh)).Cast<Scalar>();
}
points.Add(new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
......
......@@ -50,7 +50,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
EffectiveCrossSectionArea = aerodynamicDragArea
},
new CrossWindCorrectionEntry {
Velocity = 150.KMPHtoMeterPerSecond(),
Velocity = 130.KMPHtoMeterPerSecond(),
EffectiveCrossSectionArea = aerodynamicDragArea
}
}.ToList();
......@@ -91,8 +91,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
return ParseCdxABetaFromColumnIndices(betaTable);
}
protected static List<CrossWindCorrectionEntry> ParseSpeedDependent(DataTable data,
SquareMeter aerodynamicDragArea)
protected static List<CrossWindCorrectionEntry> ParseSpeedDependent(DataTable data, SquareMeter aerodynamicDragArea)
{
if (data.Columns.Count != 2) {
throw new VectoException("Crosswind correction file must consist of 2 columns.");
......@@ -112,8 +111,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
return ParseSpeedDependentFromColumnIndizes(data, aerodynamicDragArea);
}
protected static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> ParseSpeedDependentFromColumnIndizes(
DataTable data,
protected static List<CrossWindCorrectionEntry> ParseSpeedDependentFromColumnIndizes(DataTable data,
SquareMeter aerodynamicDragArea)
{
return (from DataRow row in data.Rows
......@@ -123,8 +121,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
}).ToList();
}
protected static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> ParseSpeedDependentFromColumnNames(
DataTable data,
protected static List<CrossWindCorrectionEntry> ParseSpeedDependentFromColumnNames(DataTable data,
SquareMeter aerodynamicDragArea)
{
return (from DataRow row in data.Rows
......
......@@ -30,6 +30,7 @@
*/
using System.Collections.Generic;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Simulation.DataBus;
......@@ -68,11 +69,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
{
var p = Entries.GetSection(c => c.Velocity < x);
if (x < p.Item1.Velocity || p.Item2.Velocity < x) {
//Log.Error(_data.CrossWindCorrectionMode == CrossWindCorrectionMode.VAirBetaLookupTable
// ? string.Format("CdExtrapol β = {0}", x)
// : string.Format("CdExtrapol v = {0}", x));
Log.Error("CrossWindCorrection Extrapolation: v = {0} (max = {1})", x.ConvertTo().Kilo.Meter.Per.Hour,
if (!x.IsBetween(p.Item1.Velocity, p.Item2.Velocity)) {
throw new VectoException("CrossWindCorrection Extrapolation: v = {0} (max = {1})", x.ConvertTo().Kilo.Meter.Per.Hour,
p.Item2.Velocity.ConvertTo().Kilo.Meter.Per.Hour);
}
......
......@@ -173,14 +173,18 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
}
}
[Test,
TestCase(VehicleCategory.Tractor, 6.46, 0, 8.12204),
TestCase(VehicleCategory.Tractor, 6.46, 60, 8.12204),
TestCase(VehicleCategory.Tractor, 6.46, 75, 7.67058),
TestCase(VehicleCategory.Tractor, 6.46, 100, 7.23735),
TestCase(VehicleCategory.Tractor, 6.46, 52.1234, 8.12196),
TestCase(VehicleCategory.Tractor, 6.46, 73.5432, 7.70815),
TestCase(VehicleCategory.Tractor, 6.46, 92.8765, 7.33443),
[
TestCase(VehicleCategory.Tractor, 6.46, 0, 8.12204),
TestCase(VehicleCategory.Tractor, 6.46, 60, 8.12204),
TestCase(VehicleCategory.Tractor, 6.46, 75, 7.67058),
TestCase(VehicleCategory.Tractor, 6.46, 100, 7.23735),
TestCase(VehicleCategory.Tractor, 6.46, 52.1234, 8.12196),
TestCase(VehicleCategory.Tractor, 6.46, 73.5432, 7.70815),
TestCase(VehicleCategory.Tractor, 6.46, 92.8765, 7.33443),
TestCase(VehicleCategory.Tractor, 6.46, 103, 7.2025564),
TestCase(VehicleCategory.Tractor, 6.46, 105, 7.17936),
TestCase(VehicleCategory.Tractor, 6.46, 115, 7.08174),
TestCase(VehicleCategory.Tractor, 6.46, 130, 6.96979),
]
public void CrossWindCorrectionTest(VehicleCategory vehicleCategory, double crossSectionArea, double kmph,
double expected)
......@@ -193,6 +197,20 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
Assert.AreEqual(expected, tmp.Value(), Tolerance);
}
[
TestCase(VehicleCategory.Tractor, 6.46, -0.1),
TestCase(VehicleCategory.Tractor, 6.46, 130.1),
]
public void CrossWindCorrectionExceptionTest(VehicleCategory vehicleCategory, double crossSectionArea, double kmph)
{
var crossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(
DeclarationDataAdapter.GetDeclarationAirResistanceCurve(vehicleCategory, crossSectionArea.SI<SquareMeter>()),
CrossWindCorrectionMode.DeclarationModeCorrection);
AssertHelper.Exception<VectoException>(() =>
crossWindCorrectionCurve.EffectiveAirDragArea(kmph.KMPHtoMeterPerSecond()));
}
[Test,
// fixed points
TestCase(150, 1.000, 1.000, 0.00),
......
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