diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdaper/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdaper/DeclarationDataAdapter.cs index 33966847e518f1c1c37e36c20efe0288e4e07bd3..543ed3b31f2083156cdf618f189429017e8a1b98 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdaper/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdaper/DeclarationDataAdapter.cs @@ -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 { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrossWindCorrectionCurveReader.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrossWindCorrectionCurveReader.cs index a85875497dc40ca840f44f43b79256803965ff96..8b401ad19e6b91a5c09c96b0b9c82265228f8064 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrossWindCorrectionCurveReader.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrossWindCorrectionCurveReader.cs @@ -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 diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs index 9e29d58e916a96ec70edb0e445c5222f4949abc6..0c089b04af8c936f95e83a0aa172361735abb4e6 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs @@ -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); } diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs index 0cbf0383c1918dee086aa9da10be736c297caf78..9c5d7a9b427b5f28686bbeb33d253c3a894a77f1 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs @@ -173,14 +173,19 @@ 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, 100.449, 7.2321466), + 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 +198,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),