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

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

test for air drag, basic calculation

parent 12cfbe63
No related branches found
No related tags found
No related merge requests found
using System;
using System.Data;
using System.Linq;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.Declaration
{
public class AirDrag : LookupData<string, AirDrag.AirDragEntry>
{
private const string ResourceId = "TUGraz.VectoCore.Resources.Declaration.VCDV.parameters.csv";
public AirDrag()
{
ParseData(ReadCsvResource(ResourceId));
}
protected override void ParseData(DataTable table)
{
Data = table.Rows.Cast<DataRow>().ToDictionary(row => row.Field<string>("Parameters"), row => new AirDragEntry {
A1 = row.ParseDouble("a1"),
A2 = row.ParseDouble("a2"),
A3 = row.ParseDouble("a3")
});
}
public AirDragEntry Lookup(VehicleCategory category)
{
switch (category) {
case VehicleCategory.CityBus:
case VehicleCategory.InterurbanBus:
case VehicleCategory.Coach:
return Lookup("CoachBus");
case VehicleCategory.Tractor:
return Lookup("TractorSemitrailer");
case VehicleCategory.RigidTruck:
return Lookup("RigidSolo");
default:
throw new ArgumentOutOfRangeException("category", category, null);
}
}
public class AirDragEntry
{
public double A1 { get; set; }
public double A2 { get; set; }
public double A3 { get; set; }
}
}
}
\ No newline at end of file
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;
......@@ -222,75 +220,4 @@ 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
using System;
using System.Collections.Generic;
using System.Linq;
using TUGraz.VectoCore.Configuration;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
......@@ -83,6 +87,60 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return (Cd * _data.CrossSectionArea * Physics.AirDensity / 2 * vAir * vAir).Cast<Newton>();
}
protected void CalculateAirResistanceCurve()
{
// todo: get from vehicle or move whole procedure to vehicle
var cdA0Actual = 0;
var values = DeclarationData.AirDrag.Lookup(_data.VehicleCategory);
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 = Physics.BaseWindSpeed * Math.Cos(alpha * Math.PI / 180);
var vWindY = Physics.BaseWindSpeed * 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];
}
protected Newton AccelerationForce(MeterPerSquareSecond accelleration)
{
return ((_data.TotalVehicleWeight() + _data.ReducedMassWheels) * accelleration).Cast<Newton>();
......
......@@ -7,5 +7,7 @@
public static readonly SI AirDensity = 1.188.SI().Kilo.Gramm.Per.Cubic.Meter;
public static readonly double RollResistanceExponent = 0.9;
public static readonly MeterPerSecond BaseWindSpeed = 3.SI().Kilo.Meter.Per.Hour.Cast<MeterPerSecond>();
}
}
\ No newline at end of file
......@@ -67,7 +67,7 @@ namespace TUGraz.VectoCore.Utils
public static T Sqrt<T>(SI si) where T : SIBase<T>
{
si.Sqrt().Cast<T>();
return si.Sqrt().Cast<T>();
}
}
}
\ No newline at end of file
......@@ -139,6 +139,7 @@
<Compile Include="Models\Connector\Ports\Impl\Response.cs" />
<Compile Include="Models\Connector\Ports\IFvPort.cs" />
<Compile Include="Models\Connector\Ports\ITnPort.cs" />
<Compile Include="Models\Declaration\AirDrag.cs" />
<Compile Include="Models\Declaration\Fan.cs" />
<Compile Include="Models\Declaration\HVAC.cs" />
<Compile Include="Models\Declaration\PneumaticSystem.cs" />
......
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