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

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

corrected range error in delauney map (for high transmission, triangulation was not correct)

parent 462cef5a
No related branches found
No related tags found
No related merge requests found
......@@ -33,6 +33,7 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Diagnostics;
using System.Linq;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
......@@ -146,9 +147,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
_lossMap = new DelauneyMap();
_invertedLossMap = new DelauneyMap();
foreach (var entry in _entries) {
var outTorque = (entry.InputTorque - entry.TorqueLoss) * _ratio;
var outSpeed = (entry.InputSpeed / _ratio).ConvertTo().Rounds.Per.Minute.Value();
_lossMap.AddPoint(outSpeed, outTorque.Value(), entry.TorqueLoss.Value());
_lossMap.AddPoint(entry.InputSpeed.ConvertTo().Rounds.Per.Minute.Value(), (entry.InputTorque - entry.TorqueLoss).Value(), entry.TorqueLoss.Value());
_invertedLossMap.AddPoint(entry.InputSpeed.ConvertTo().Rounds.Per.Minute.Value(), entry.InputTorque.Value(), entry.TorqueLoss.Value());
}
......@@ -165,7 +164,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
/// <returns>Torque loss as seen on input side (towards the engine).</returns>
public NewtonMeter GetTorqueLoss(PerSecond outAngularVelocity, NewtonMeter outTorque)
{
var torqueLoss = _lossMap.Interpolate(outAngularVelocity.ConvertTo().Rounds.Per.Minute.Value(), outTorque.Value(), true).SI<NewtonMeter>();
var torqueLoss = _lossMap.Interpolate(outAngularVelocity.ConvertTo().Rounds.Per.Minute.Value() * _ratio, outTorque.Value() / _ratio, true).SI<NewtonMeter>();
Log.Debug("GearboxLoss {0}: {1}, outAngularVelocity: {2}, outTorque: {3}", GearName, torqueLoss,
outAngularVelocity, outTorque);
......@@ -191,6 +190,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
get { return _entries[i]; }
}
[DebuggerDisplay("GearLossMapEntry({InputSpeed}, {InputTorque}, {TorqueLoss})")]
public class GearLossMapEntry
{
[Required, SIRange(0, 5000)]
......
......@@ -31,19 +31,16 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading;
using System.Windows.Forms.DataVisualization.Charting;
using Newtonsoft.Json;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Declaration;
namespace TUGraz.VectoCore.Utils
{
......@@ -91,17 +88,17 @@ namespace TUGraz.VectoCore.Utils
var points = Points.ToArray();
//var xmin = points.Min(p => p.X) - 1;
//var xmax = points.Max(p => p.X) + 1;
//var ymin = points.Min(p => p.Y) - 1;
//var ymax = points.Max(p => p.Y) + 1;
var xmin = points.Min(p => p.X);
var xmax = points.Max(p => p.X);
var ymin = points.Min(p => p.Y);
var ymax = points.Max(p => p.Y);
// iteratively add each point into the correct triangle and split up the triangle
for (var i = 0; i < points.Length; i++) {
var point = points[i];
foreach (var point in points) {
// If the vertex lies inside the circumcircle of a triangle, the edges of this triangle are
// added to the edge buffer and the triangle is removed from list.
var containerTriangles = triangles.FindAll(t => t.ContainsInCircumcircle(point));
var point1 = point;
var containerTriangles = triangles.FindAll(t => t.ContainsInCircumcircle(point1));
triangles = triangles.Except(containerTriangles).ToList();
// Remove duplicate edges. This leaves the convex hull of the edges.
......@@ -113,8 +110,9 @@ namespace TUGraz.VectoCore.Utils
var newTriangles = convexHullEdges.Select(edge => new Triangle(edge.P1, edge.P2, point)).ToList();
triangles.AddRange(newTriangles);
//DrawGraph(pointCount, triangles, superTriangle, xmin, xmax, ymin, ymax, point);
pointCount++;
// check invariant: m = 2n-2-k
// m...triangle count
// n...point count (pointCount +3 points on the supertriangle)
......@@ -123,10 +121,10 @@ namespace TUGraz.VectoCore.Utils
throw new VectoException(
"Delauney-Triangulation invariant violated! Triangle count and point count doesn't fit together.");
}
//if (superTriangle.GetHashCode() == -540272836)
// DrawGraph(i, triangles, superTriangle, xmin, xmax, ymin, ymax);
}
//DrawGraph(pointCount, triangles, superTriangle, xmin, xmax, ymin, ymax);
_convexHull = triangles.FindAll(t => t.SharesVertexWith(superTriangle)).
SelectMany(t => t.GetEdges()).
Where(e => !(superTriangle.Contains(e.P1) || superTriangle.Contains(e.P2))).ToArray();
......@@ -134,18 +132,22 @@ namespace TUGraz.VectoCore.Utils
_triangles = triangles.FindAll(t => !t.SharesVertexWith(superTriangle));
}
private void DrawGraph(int i, List<Triangle> triangles, Triangle superTriangle, double xmin, double xmax, double ymin, double ymax)
/// <summary>
/// Draws the delauney map (except supertriangle).
/// </summary>
private void DrawGraph(int i, List<Triangle> triangles, Triangle superTriangle, double xmin, double xmax, double ymin, double ymax, Point lastPoint = null)
{
using (var chart = new Chart { Width = 1500, Height = 700 }) {
using (var chart = new Chart { Width = 1000, Height = 1000 }) {
chart.ChartAreas.Add(new ChartArea("main") {
AxisX = new Axis { Minimum = xmin, Maximum = xmax},
AxisY = new Axis { Minimum = ymin, Maximum = ymax }
AxisX = new Axis { Minimum = Math.Min(xmin, ymin), Maximum = Math.Max(xmax,ymax) },
AxisY = new Axis { Minimum = Math.Min(xmin, ymin), Maximum = Math.Max(xmax,ymax) }
});
foreach (var tr in triangles) {
if (tr.SharesVertexWith(superTriangle))
continue;
var series = new Series {ChartType = SeriesChartType.FastLine};
var series = new Series { ChartType = SeriesChartType.FastLine, Color = lastPoint != null && tr.Contains(lastPoint)? Color.Red : Color.Blue };
series.Points.AddXY(tr.P1.X, tr.P1.Y);
series.Points.AddXY(tr.P2.X, tr.P2.Y);
series.Points.AddXY(tr.P3.X, tr.P3.Y);
......@@ -153,9 +155,18 @@ namespace TUGraz.VectoCore.Utils
chart.Series.Add(series);
}
chart.Invalidate();
Directory.CreateDirectory(string.Format("delauney\\{0}", superTriangle.GetHashCode()));
chart.SaveImage(string.Format("delauney\\{0}\\{1}.png", superTriangle.GetHashCode(), i), ChartImageFormat.Png);
if (lastPoint != null) {
var series = new Series{ ChartType = SeriesChartType.Point, Color = Color.Red, MarkerSize = 5, MarkerStyle = MarkerStyle.Circle};
series.Points.AddXY(lastPoint.X, lastPoint.Y);
chart.Series.Add(series);
}
var frame = new StackFrame(2);
var method = frame.GetMethod();
var type = method.DeclaringType.Name;
var methodName = method.Name;
Directory.CreateDirectory("delauney");
chart.SaveImage(string.Format("delauney\\{0}_{1}_{2}_{3}.png", type, methodName, superTriangle.GetHashCode(), i), ChartImageFormat.Png);
}
}
......
......@@ -112,7 +112,7 @@ namespace TUGraz.VectoCore.Utils
public static T Limit<T>(this T value, T lowerBound, T upperBound) where T : IComparable
{
if (lowerBound.CompareTo(upperBound) > 0) {
throw new VectoException("VectoMath.Limit: lowerBound must not be greater than upperBound");
throw new VectoException("VectoMath.Limit: lowerBound must not be greater than upperBound. lowerBound: {0}, upperBound: {1}", lowerBound, upperBound);
}
if (value.CompareTo(upperBound) > 0) {
......
......@@ -152,7 +152,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
AssertHelper.AreRelativeEqual(absTime, port.AbsTime);
AssertHelper.AreRelativeEqual(dt, port.Dt);
AssertHelper.AreRelativeEqual(n, port.AngularVelocity);
AssertHelper.AreRelativeEqual(2654.06.SI<NewtonMeter>(), port.Torque);
AssertHelper.AreRelativeEqual(2658.10267.SI<NewtonMeter>(), port.Torque);
absTime += dt;
t = -1300.SI<NewtonMeter>();
......@@ -163,7 +163,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
AssertHelper.AreRelativeEqual(absTime, port.AbsTime);
AssertHelper.AreRelativeEqual(dt, port.Dt);
AssertHelper.AreRelativeEqual(n, port.AngularVelocity);
AssertHelper.AreRelativeEqual(-1264.82.SI<NewtonMeter>(), port.Torque);
AssertHelper.AreRelativeEqual(-1272.4030255.SI<NewtonMeter>(), port.Torque);
}
[TestMethod]
......@@ -196,7 +196,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
Assert.AreEqual(absTime, port.AbsTime);
Assert.AreEqual(dt, port.Dt);
Assert.AreEqual(n, port.AngularVelocity);
Assert.AreEqual(-2264.82.SI<NewtonMeter>(), port.Torque);
AssertHelper.AreRelativeEqual(-2272.3774.SI<NewtonMeter>(), port.Torque);
var modData = new MockModalDataContainer();
Assert.IsTrue(gearbox.ModelData.Gears[gearbox.Gear].LossMap.Extrapolated);
......@@ -233,7 +233,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
Assert.AreEqual(absTime, port.AbsTime);
Assert.AreEqual(dt, port.Dt);
Assert.AreEqual(n, port.AngularVelocity);
Assert.AreEqual(-2464.82.SI<NewtonMeter>(), port.Torque);
AssertHelper.AreRelativeEqual(-2472.3723.SI<NewtonMeter>(), port.Torque);
var modData = new MockModalDataContainer();
Assert.IsTrue(gearbox.ModelData.Gears[gearbox.Gear].LossMap.Extrapolated);
......@@ -271,7 +271,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
Assert.AreEqual(absTime, port.AbsTime);
Assert.AreEqual(dt, port.Dt);
Assert.AreEqual(n, port.AngularVelocity);
Assert.AreEqual(-2464.82.SI<NewtonMeter>(), port.Torque);
AssertHelper.AreRelativeEqual(-2472.3723.SI<NewtonMeter>(), port.Torque);
t = -1000.SI<NewtonMeter>();
n = 1000.RPMtoRad();
......@@ -282,7 +282,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
Assert.AreEqual(absTime, port.AbsTime);
Assert.AreEqual(dt, port.Dt);
Assert.AreEqual(n, port.AngularVelocity);
AssertHelper.AreRelativeEqual(-973.15585.SI<NewtonMeter>(), port.Torque);
AssertHelper.AreRelativeEqual(-972.95098.SI<NewtonMeter>(), port.Torque);
var modData = new MockModalDataContainer();
gearbox.CommitSimulationStep(modData);
......
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