From c3b1db31154b977d16fee91a756bb43b0f9575e9 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Fri, 13 May 2016 09:31:48 +0200
Subject: [PATCH] simplified computation of average AirPowerLoss

---
 .../Data/CrosswindCorrectionCdxALookup.cs     | 20 +++++++------------
 .../Data/CrosswindCorrectionVAirBeta.cs       |  2 +-
 .../Data/ICrossWindCorrection.cs              |  2 +-
 .../SimulationComponent/Impl/Vehicle.cs       |  6 +++---
 .../Simulation/MeasuredSpeedModeTest.cs       | 12 +++++------
 5 files changed, 18 insertions(+), 24 deletions(-)

diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CrosswindCorrectionCdxALookup.cs
index 1a0977e7f8..d492bc5109 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 58ff6a8531..b6627f1895 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 89d720a0e8..f664ebf1f2 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 ccdb42b44a..6facbf6919 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 c73a60b201..0a380e6882 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);
 		}
 	}
-- 
GitLab