diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs index 1a0977e7f8656272f7105c2cfdeb0e7ddd1a8894..d492bc51093ef866c247c3f5f2f40b1622cbaa20 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs @@ -53,22 +53,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public void SetDataBus(IDataBus dataBus) {} - public Watt AverageAirDragPowerLoss(MeterPerSecond v1, MeterPerSecond v2, Second dt) + public Watt AverageAirDragPowerLoss(MeterPerSecond v1, MeterPerSecond v2) { var vAverage = (v1 + v2) / 2; var cdA = EffectiveAirDragArea(vAverage); - Watt averageAirDragPower; - if (v1.IsEqual(v2)) { - averageAirDragPower = (Physics.AirDensity / 2.0 * cdA * vAverage * vAverage * vAverage).Cast<Watt>(); - } else { - // compute the average force within the current simulation interval - // P(t) = k * CdA * v(t)^3 , v(t) = v0 + a * t // a != 0, P_avg = 1/T * Integral P(t) dt - // => P_avg = (CdA * rho/2)/(4*a * dt) * (v2^4 - v1^4) - var acceleration = (v2 - v1) / dt; - averageAirDragPower = - (Physics.AirDensity / 2.0 * cdA * (v2 * v2 * v2 * v2 - v1 * v1 * v1 * v1) / (4 * acceleration * dt)).Cast<Watt>(); - } - return averageAirDragPower; + + // compute the average force within the current simulation interval + // P(t) = k * CdA * v(t)^3 , v(t) = v0 + a * t // P_avg = 1/T * Integral P(t) dt + // => P_avg = (CdA * rho/2)/(4*a * dt) * (v2^4 - v1^4) // a = (v2-v1)/dt + // -> P_avg = (CdA * rho/2) * (v2^4 - v1^4) / (v2 - v1) = (CdA * rho/2) * (v1 + v2) * (v1^2 + v2^2) + return (Physics.AirDensity / (2.0 * 4) * cdA * (v1 + v2) * (v1 * v1 + v2 * v2)).Cast<Watt>(); } protected internal SquareMeter EffectiveAirDragArea(MeterPerSecond x) diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionVAirBeta.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionVAirBeta.cs index 58ff6a853197f36216f33cc4c55332a8c9fc1437..b6627f1895eb89f309e66fd72c473218d9ac5900 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionVAirBeta.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionVAirBeta.cs @@ -64,7 +64,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data get { return CrossWindCorrectionMode.VAirBetaLookupTable; } } - public Watt AverageAirDragPowerLoss(MeterPerSecond v1, MeterPerSecond v2, Second dt) + public Watt AverageAirDragPowerLoss(MeterPerSecond v1, MeterPerSecond v2) { if (DataBus == null) { throw new VectoException("Databus is not set - can't access vAir, beta!"); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ICrossWindCorrection.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ICrossWindCorrection.cs index 89d720a0e8676417afc6782d62c991889916446f..f664ebf1f2e1b41e1324a03d1afa83d755faa80b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ICrossWindCorrection.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ICrossWindCorrection.cs @@ -43,6 +43,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data CrossWindCorrectionMode CorrectionMode { get; } - Watt AverageAirDragPowerLoss(MeterPerSecond v1, MeterPerSecond v2, Second dt); + Watt AverageAirDragPowerLoss(MeterPerSecond v1, MeterPerSecond v2); } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs index ccdb42b44af6f39a59dc47cdaca3865e0e2aacac..6facbf6919563143e5cbe5e01ad957d24063af6f 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs @@ -222,16 +222,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (vAverage.IsEqual(0)) { return 0.SI<Newton>(); } - var result = ComputeAirDragPowerLoss(previousVelocity, previousVelocity + acceleration * dt, dt) / + var result = ComputeAirDragPowerLoss(previousVelocity, previousVelocity + acceleration * dt) / vAverage; Log.Debug("AirDragResistance: {0}", result); return result; } - private Watt ComputeAirDragPowerLoss(MeterPerSecond v1, MeterPerSecond v2, Second dt) + private Watt ComputeAirDragPowerLoss(MeterPerSecond v1, MeterPerSecond v2) { - return ModelData.CrossWindCorrectionCurve.AverageAirDragPowerLoss(v1, v2, dt); + return ModelData.CrossWindCorrectionCurve.AverageAirDragPowerLoss(v1, v2); } public class VehicleState diff --git a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs index c73a60b2018d6c2bd13511389f69d1380268fd9b..0a380e688257b8106d7453f85f28db8149e7d9c8 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs @@ -446,31 +446,31 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation dataBus.CycleData = new CycleData() { LeftSample = cycleEntry }; var pAvg = - vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 20.KMPHtoMeterPerSecond(), 1.SI<Second>()).Value(); + vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 20.KMPHtoMeterPerSecond()).Value(); Assert.AreEqual(509.259, pAvg, 1e-3); pAvg = - vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 21.KMPHtoMeterPerSecond(), 1.SI<Second>()).Value(); + vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 21.KMPHtoMeterPerSecond()).Value(); Assert.AreEqual(521.990, pAvg, 1e-3); pAvg = - vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 30.KMPHtoMeterPerSecond(), 1.SI<Second>()).Value(); + vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 30.KMPHtoMeterPerSecond()).Value(); Assert.AreEqual(636.574, pAvg, 1e-3); cycleEntry.WindYawAngle = 20; pAvg = - vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 20.KMPHtoMeterPerSecond(), 1.SI<Second>()).Value(); + vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 20.KMPHtoMeterPerSecond()).Value(); Assert.AreEqual(829.074, pAvg, 1e-3); pAvg = - vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 30.KMPHtoMeterPerSecond(), 1.SI<Second>()).Value(); + vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 30.KMPHtoMeterPerSecond()).Value(); Assert.AreEqual(1036.343, pAvg, 1e-3); cycleEntry.WindYawAngle = -120; pAvg = - vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 20.KMPHtoMeterPerSecond(), 1.SI<Second>()).Value(); + vairbeta.AverageAirDragPowerLoss(20.KMPHtoMeterPerSecond(), 20.KMPHtoMeterPerSecond()).Value(); Assert.AreEqual(-1019.5370, pAvg, 1e-3); } }