Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit c2de1ba0 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

Merge pull request #48 in VECTO/vecto-sim from...

Merge pull request #48 in VECTO/vecto-sim from ~EMKRISPMI/vecto-sim:feature/VECTO-79-add-jobcontainer-or-similar to develop

* commit 'fef1a3f7':
  added fields for vehicle mass and vehicle loading in sum file
  acceleration average over seconds and 3 second running average
  V79 structurally finished. Still some changes needed (which fields in engineonly mode, correct calculation of the 3second average in sum file).
  sum file gets written. nearly all tests running.
  sum file write / changed some interfaces and testcases
  changes for sum file
  shorter vectojob tests
  tests for reading vecto job file, executing the job and writing moddata
  changed port provider interfaces, finished builder for assembling a full powertrain
  reading of job file, added methods for builder, added new auxiliary class for mapping-auxiliaries
  added test method and test files for job file
  added code comments, corrected error in IsEqual for double comparison with tolerance.
  reading job file, added builder for the powertrain
  faster job tests, all tests runable and successful
  more SI tests, easier SI units
  changed a test to run much faster. temporarily ignored job tests.
  preparings for sum file
  started with classes for reading job file and writing sum file
parents dfc7420d fef1a3f7
Branches
Tags
No related merge requests found
Showing
with 2715 additions and 245 deletions
......@@ -2,66 +2,116 @@ using System;
namespace TUGraz.VectoCore.Utils
{
/// <summary>
/// Extension methods for double.
/// </summary>
public static class DoubleExtensionMethods
{
/// <summary>
/// The tolerance.
/// </summary>
public const double Tolerance = 0.001;
public static bool IsEqual(this double d, double other, double tolerance = Tolerance)
/// <summary>
/// Determines whether the specified other is equal within tolerance.
/// </summary>
/// <param name="self">The self.</param>
/// <param name="other">The other.</param>
/// <param name="tolerance">The tolerance.</param>
/// <returns></returns>
public static bool IsEqual(this double self, double other, double tolerance = Tolerance)
{
return Math.Abs(d - other) > -tolerance;
return Math.Abs(self - other) < tolerance;
}
public static bool IsSmaller(this double d, double other, double tolerance = Tolerance)
/// <summary>
/// Determines whether the specified other is smaller within tolerance.
/// </summary>
/// <param name="self">The self.</param>
/// <param name="other">The other.</param>
/// <param name="tolerance">The tolerance.</param>
/// <returns></returns>
public static bool IsSmaller(this double self, double other, double tolerance = Tolerance)
{
return d - other < tolerance;
return self - other < tolerance;
}
public static bool IsSmallerOrEqual(this double d, double other, double tolerance = Tolerance)
/// <summary>
/// Determines whether the specified other is smaller or equal within tolerance.
/// </summary>
/// <param name="self">The self.</param>
/// <param name="other">The other.</param>
/// <param name="tolerance">The tolerance.</param>
/// <returns></returns>
public static bool IsSmallerOrEqual(this double self, double other, double tolerance = Tolerance)
{
return d - other <= tolerance;
return self - other <= tolerance;
}
public static bool IsGreater(this double d, double other, double tolerance = Tolerance)
/// <summary>
/// Determines whether the specified other is greater within tolerance.
/// </summary>
/// <param name="self">The self.</param>
/// <param name="other">The other.</param>
/// <param name="tolerance">The tolerance.</param>
/// <returns></returns>
public static bool IsGreater(this double self, double other, double tolerance = Tolerance)
{
return other.IsSmallerOrEqual(d, tolerance);
return other.IsSmallerOrEqual(self, tolerance);
}
public static bool IsGreaterOrEqual(this double d, double other, double tolerance = Tolerance)
/// <summary>
/// Determines whether the specified other is greater or equal within tolerance.
/// </summary>
/// <param name="self">The self.</param>
/// <param name="other">The other.</param>
/// <param name="tolerance">The tolerance.</param>
/// <returns></returns>
public static bool IsGreaterOrEqual(this double self, double other, double tolerance = Tolerance)
{
return other.IsSmaller(d, tolerance);
return other.IsSmaller(self, tolerance);
}
public static bool IsPositive(this double d, double tolerance = Tolerance)
/// <summary>
/// Determines whether the specified tolerance is positive within tolerance.
/// </summary>
/// <param name="self">The self.</param>
/// <param name="tolerance">The tolerance.</param>
/// <returns></returns>
public static bool IsPositive(this double self, double tolerance = Tolerance)
{
return d.IsGreaterOrEqual(0.0, tolerance);
return self.IsGreaterOrEqual(0.0, tolerance);
}
/// <summary>
/// Converts the double-value from rounds per minute to the SI Unit PerSecond
/// Converts the double-value from RPM (rounds per minute) to the SI Unit PerSecond.
/// </summary>
/// <param name="d"></param>
/// <param name="self"></param>
/// <returns></returns>
public static PerSecond RPMtoRad(this double d)
public static PerSecond RPMtoRad(this double self)
{
return d.SI().Rounds.Per.Minute.ConvertTo().Radian.Per.Second.Cast<PerSecond>();
return self.SI().Rounds.Per.Minute.ConvertTo().Radian.Per.Second.Cast<PerSecond>();
}
/// <summary>
/// Gets the SI representation of the number (unit-less).
/// Creates an SI object for the number (unit-less: [-]).
/// </summary>
public static SI SI(this double d)
/// <param name="self">The self.</param>
/// <returns></returns>
public static SI SI(this double self)
{
return (SI) d;
return (SI)self;
}
/// <summary>
/// Gets the special SI class of the number.
/// Creates an templated SI object for the number.
/// </summary>
public static T SI<T>(this double d) where T : SIBase<T>, new()
/// <typeparam name="T"></typeparam>
/// <param name="self">The self.</param>
/// <returns></returns>
public static T SI<T>(this double self) where T : SIBase<T>
{
return SIBase<T>.Create(d);
return SIBase<T>.Create(self);
}
}
}
\ No newline at end of file
......@@ -30,7 +30,7 @@ namespace TUGraz.VectoCore.Utils
/// </summary>
/// <param name="d"></param>
/// <returns></returns>
public static T SI<T>(this int d) where T : SIBase<T>, new()
public static T SI<T>(this int d) where T : SIBase<T>
{
return SIBase<T>.Create(d);
}
......
......@@ -4,27 +4,56 @@ using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
namespace TUGraz.VectoCore.Utils
{
public class MeterPerSecond : SIBase<MeterPerSecond>
public class Newton : SIBase<Newton>
{
static Newton()
{
Constructors.Add(typeof(Newton), val => new Newton(val));
}
[JsonConstructor]
private Newton(double val) : base(new SI(val).Newton) {}
}
public class Radian : SIBase<Radian>
{
static Radian()
{
public MeterPerSecond() : this(0) {}
protected MeterPerSecond(double val) : base(val, new SI().Meter.Per.Second) {}
Constructors.Add(typeof(Radian), val => new Radian(val));
}
[JsonConstructor]
private Radian(double val) : base(new SI(val).Radian) {}
}
public class Second : SIBase<Second>
{
public Second() : this(0) {}
protected Second(double val) : base(val, new SI().Second) {}
static Second()
{
Constructors.Add(typeof(Second), val => new Second(val));
}
[JsonConstructor]
private Second(double val) : base(new SI(val).Second) {}
}
public class Watt : SIBase<Watt>
{
public Watt() : this(0) {}
protected Watt(double val) : base(val, new SI().Watt) {}
static Watt()
{
Constructors.Add(typeof(Watt), val => new Watt(val));
}
[JsonConstructor]
private Watt(double val) : base(new SI(val).Watt) {}
public static PerSecond operator /(Watt watt, NewtonMeter newtonMeter)
{
......@@ -39,33 +68,48 @@ namespace TUGraz.VectoCore.Utils
public class PerSecond : SIBase<PerSecond>
{
public PerSecond() : this(0) {}
protected PerSecond(double val) : base(val, new SI().Radian.Per.Second) {}
static PerSecond()
{
Constructors.Add(typeof(PerSecond), val => new PerSecond(val));
}
public class RoundsPerMinute : SIBase<RoundsPerMinute>
[JsonConstructor]
private PerSecond(double val) : base(new SI(val).Per.Second) {}
}
public class MeterPerSecond : SIBase<MeterPerSecond>
{
public RoundsPerMinute() : this(0) {}
protected RoundsPerMinute(double val) : base(val, new SI().Rounds.Per.Minute) {}
static MeterPerSecond()
{
Constructors.Add(typeof(MeterPerSecond), val => new MeterPerSecond(val));
}
[JsonConstructor]
private MeterPerSecond(double val) : base(new SI(val).Meter.Per.Second) {}
}
public class Newton : SIBase<Newton>
public class RoundsPerMinute : SIBase<RoundsPerMinute>
{
public Newton() : this(0) {}
protected Newton(double val) : base(val, new SI().Newton) {}
static RoundsPerMinute()
{
Constructors.Add(typeof(RoundsPerMinute), val => new RoundsPerMinute(val));
}
public class Radian : SIBase<Radian>
{
public Radian() : this(0) {}
protected Radian(double val) : base(val, new SI().Radian) {}
[JsonConstructor]
private RoundsPerMinute(double val) : base(new SI(val).Rounds.Per.Minute) {}
}
public class NewtonMeter : SIBase<NewtonMeter>
{
public NewtonMeter() : this(0) {}
protected NewtonMeter(double val) : base(val, new SI().Newton.Meter) {}
static NewtonMeter()
{
Constructors.Add(typeof(NewtonMeter), val => new NewtonMeter(val));
}
[JsonConstructor]
private NewtonMeter(double val) : base(new SI(val).Newton.Meter) {}
public static Watt operator *(NewtonMeter newtonMeter, PerSecond perSecond)
{
......@@ -83,17 +127,23 @@ namespace TUGraz.VectoCore.Utils
}
}
public abstract class SIBase<T> : SI where T : SIBase<T>, new()
public abstract class SIBase<T> : SI where T : SIBase<T>
{
protected static Dictionary<Type, Func<double, T>> Constructors =
new Dictionary<Type, Func<double, T>>();
public static T Create(double val)
{
return new T { Val = val };
RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle);
return Constructors[typeof(T)](val);
}
protected SIBase() {}
protected SIBase(double val) : base(val) {}
protected SIBase(double val, SI unit) : base(val, unit) {}
protected SIBase(Type type, Func<double, T> constructor)
{
Constructors[type] = constructor;
}
protected SIBase(SI si) : base(si) {}
#region Operators
......@@ -187,59 +237,20 @@ namespace TUGraz.VectoCore.Utils
[DataMember] protected readonly Unit[] Numerator;
[DataMember] protected readonly bool Reciproc;
[DataMember] protected readonly bool Reverse;
[DataMember] protected double Val;
[DataMember] protected readonly double Val;
[SuppressMessage("ReSharper", "InconsistentNaming")]
protected enum Unit
{
/// <summary>
/// kilo
/// </summary>
k,
/// <summary>
/// seconds
/// </summary>
s,
/// <summary>
/// meter
/// </summary>
m,
/// <summary>
/// gramm
/// </summary>
g,
/// <summary>
/// Watt
/// </summary>
W,
/// <summary>
/// Newton
/// </summary>
N,
/// <summary>
/// %
/// </summary>
Percent,
/// <summary>
/// minutes
/// </summary>
min,
/// <summary>
/// centi
/// </summary>
c,
/// <summary>
/// Hour
/// </summary>
h
}
......@@ -362,7 +373,7 @@ namespace TUGraz.VectoCore.Utils
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T Cast<T>() where T : SIBase<T>, new()
public T Cast<T>() where T : SIBase<T>
{
var t = SIBase<T>.Create(Val);
if (!HasEqualUnit(t)) {
......@@ -577,6 +588,8 @@ namespace TUGraz.VectoCore.Utils
public static SI operator +(SI si1, SI si2)
{
Contract.Requires(si1 != null);
Contract.Requires(si2 != null);
if (!si1.HasEqualUnit(si2)) {
throw new VectoException(
string.Format("Operator '+' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2));
......@@ -587,6 +600,8 @@ namespace TUGraz.VectoCore.Utils
public static SI operator -(SI si1, SI si2)
{
Contract.Requires(si1 != null);
Contract.Requires(si2 != null);
if (!si1.HasEqualUnit(si2)) {
throw new VectoException(
string.Format("Operator '-' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2));
......@@ -596,6 +611,8 @@ namespace TUGraz.VectoCore.Utils
public static SI operator *(SI si1, SI si2)
{
Contract.Requires(si1 != null);
Contract.Requires(si2 != null);
var numerator = si1.Numerator.Concat(si2.Numerator);
var denominator = si1.Denominator.Concat(si2.Denominator);
return new SI(si1.Val * si2.Val, numerator, denominator);
......@@ -603,6 +620,8 @@ namespace TUGraz.VectoCore.Utils
public static SI operator /(SI si1, SI si2)
{
Contract.Requires(si1 != null);
Contract.Requires(si2 != null);
var numerator = si1.Numerator.Concat(si2.Denominator);
var denominator = si1.Denominator.Concat(si2.Numerator);
return new SI(si1.Val / si2.Val, numerator, denominator);
......@@ -610,46 +629,62 @@ namespace TUGraz.VectoCore.Utils
public static SI operator +(SI si1, double d)
{
Contract.Requires(si1 != null);
return new SI(si1.Val + d, si1);
}
public static SI operator +(double d, SI si1)
{
Contract.Requires(si1 != null);
return si1 + d;
}
public static SI operator -(SI si1, double d)
{
Contract.Requires(si1 != null);
return new SI(si1.Val - d, si1);
}
public static SI operator -(double d, SI si1)
{
Contract.Requires(si1 != null);
return new SI(d - si1.Val, si1);
}
public static SI operator -(SI si1)
{
Contract.Requires(si1 != null);
return 0 - si1;
}
public static SI operator *(SI si1, double d)
{
Contract.Requires(si1 != null);
return new SI(si1.Val * d, si1);
}
public static SI operator *(double d, SI si1)
{
Contract.Requires(si1 != null);
return new SI(d * si1.Val, si1);
}
public static SI operator /(SI si1, double d)
{
Contract.Requires(si1 != null);
return new SI(si1.Val / d, si1);
}
public static SI operator /(double d, SI si1)
{
Contract.Requires(si1 != null);
return new SI(d / si1.Val, si1);
}
public static bool operator <(SI si1, SI si2)
{
Contract.Requires(si1 != null);
Contract.Requires(si2 != null);
if (!si1.HasEqualUnit(si2)) {
throw new VectoException(
string.Format("Operator '<' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2));
......@@ -659,6 +694,8 @@ namespace TUGraz.VectoCore.Utils
public static bool operator >(SI si1, SI si2)
{
Contract.Requires(si1 != null);
Contract.Requires(si2 != null);
if (!si1.HasEqualUnit(si2)) {
throw new VectoException(
string.Format("Operator '>' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2));
......@@ -668,6 +705,8 @@ namespace TUGraz.VectoCore.Utils
public static bool operator <=(SI si1, SI si2)
{
Contract.Requires(si1 != null);
Contract.Requires(si2 != null);
if (!si1.HasEqualUnit(si2)) {
throw new VectoException(
string.Format("Operator '<=' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2));
......@@ -677,6 +716,8 @@ namespace TUGraz.VectoCore.Utils
public static bool operator >=(SI si1, SI si2)
{
Contract.Requires(si1 != null);
Contract.Requires(si2 != null);
if (!si1.HasEqualUnit(si2)) {
throw new VectoException(
string.Format("Operator '>=' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2));
......@@ -686,21 +727,25 @@ namespace TUGraz.VectoCore.Utils
public static bool operator <(SI si1, double d)
{
Contract.Requires(si1 != null);
return si1.Val < d;
}
public static bool operator >(SI si1, double d)
{
Contract.Requires(si1 != null);
return si1.Val > d;
}
public static bool operator <=(SI si1, double d)
{
Contract.Requires(si1 != null);
return si1.Val <= d;
}
public static bool operator >=(SI si1, double d)
{
Contract.Requires(si1 != null);
return si1.Val >= d;
}
......@@ -757,7 +802,7 @@ namespace TUGraz.VectoCore.Utils
/// </summary>
public override string ToString()
{
return string.Format("{0} [{1}]", Val, GetUnitString());
return ToString(null);
}
public virtual string ToString(string format)
......@@ -765,6 +810,7 @@ namespace TUGraz.VectoCore.Utils
if (string.IsNullOrEmpty(format)) {
format = "";
}
return string.Format("{0:" + format + "} [{2}]", Val, format, GetUnitString());
}
......@@ -775,9 +821,9 @@ namespace TUGraz.VectoCore.Utils
/// <summary>
/// Compares the Unit-Parts of two SI Units.
/// </summary>
[Pure]
public bool HasEqualUnit(SI si)
{
Contract.Requires(si != null);
return ToBasicUnits()
.Denominator.OrderBy(x => x)
.SequenceEqual(si.ToBasicUnits().Denominator.OrderBy(x => x))
......@@ -816,7 +862,7 @@ namespace TUGraz.VectoCore.Utils
}
if (!HasEqualUnit(si)) {
if (si.Numerator.Length + si.Denominator.Length <= Numerator.Length + Denominator.Length) {
if (si.Numerator.Length + si.Denominator.Length >= Numerator.Length + Denominator.Length) {
return -1;
}
return 1;
......
......@@ -112,6 +112,12 @@ namespace TUGraz.VectoCore.Utils
return lines;
}
/// <summary>
/// Writes the datatable to the csv file.
/// Uses the column caption as header (with fallback to column name) for the csv header.
/// </summary>
/// <param name="fileName">Path to the file.</param>
/// <param name="table">The Datatable.</param>
public static void Write(string fileName, DataTable table)
{
var sb = new StringBuilder();
......
using System;
using Common.Logging.Factory;
using NLog.LayoutRenderers.Wrappers;
namespace TUGraz.VectoCore.Utils
{
public class VectoMath
{
public static T2 Interpolate<T1, T2>(T1 x1, T1 x2, T2 y1, T2 y2, T1 xint) where T1 : SI where T2 : SIBase<T2>, new()
public static T2 Interpolate<T1, T2>(T1 x1, T1 x2, T2 y1, T2 y2, T1 xint) where T1 : SI where T2 : SIBase<T2>
{
return ((xint - x1) * (y2 - y1) / (x2 - x1) + y1).Cast<T2>();
}
......@@ -17,7 +15,7 @@ namespace TUGraz.VectoCore.Utils
}
public static T Abs<T>(T si) where T : SIBase<T>, new()
public static T Abs<T>(T si) where T : SIBase<T>
{
return si.Abs().Cast<T>();
}
......
......@@ -117,11 +117,12 @@
<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\SimulationComponent\Data\AuxiliariesDemandAdapter.cs" />
<Compile Include="Models\SimulationComponent\Data\AuxiliaryCycleDataAdapter.cs" />
<Compile Include="Models\SimulationComponent\Data\CombustionEngineData.cs" />
<Compile Include="Models\SimulationComponent\Data\DrivingCycleData.cs" />
<Compile Include="Models\SimulationComponent\Data\Engine\FuelConsumptionMap.cs" />
<Compile Include="Models\SimulationComponent\Data\Engine\FullLoadCurve.cs" />
<Compile Include="Models\SimulationComponent\Data\IAuxiliaryCycleData.cs" />
<Compile Include="Models\SimulationComponent\Data\GearboxData.cs" />
<Compile Include="Models\SimulationComponent\Data\Gearbox\GearData.cs" />
<Compile Include="Models\SimulationComponent\Data\Gearbox\TransmissionLossMap.cs" />
......@@ -132,10 +133,20 @@
<Compile Include="Models\SimulationComponent\IClutch.cs" />
<Compile Include="Models\SimulationComponent\IEngineOnlyDrivingCycle.cs" />
<Compile Include="Models\SimulationComponent\IDriverDemandDrivingCycle.cs" />
<Compile Include="Models\SimulationComponent\Impl\AxleGear.cs" />
<Compile Include="Models\SimulationComponent\IDriver.cs" />
<Compile Include="Models\SimulationComponent\Impl\MappingAuxiliary.cs" />
<Compile Include="Models\SimulationComponent\IVehicle.cs" />
<Compile Include="Models\SimulationComponent\Impl\Clutch.cs" />
<Compile Include="Models\SimulationComponent\Impl\AxleGear.cs" />
<Compile Include="Models\SimulationComponent\Impl\Retarder.cs" />
<Compile Include="Models\SimulationComponent\IPowerTrainComponent.cs" />
<Compile Include="Models\Simulation\Data\ISummaryDataWriter.cs" />
<Compile Include="Models\Simulation\Data\SummaryFileWriter.cs" />
<Compile Include="Models\Simulation\Data\VectoJobData.cs" />
<Compile Include="Models\SimulationComponent\Impl\Driver.cs" />
<Compile Include="Models\SimulationComponent\Data\DriverData.cs" />
<Compile Include="Models\SimulationComponent\Impl\Vehicle.cs" />
<Compile Include="Models\SimulationComponent\Data\VehicleData.cs" />
<Compile Include="Utils\Formulas.cs" />
<Compile Include="Utils\IntExtensionMethods.cs" />
<Compile Include="Utils\SI.cs" />
......@@ -145,7 +156,7 @@
<Compile Include="Models\SimulationComponent\IGearbox.cs" />
<Compile Include="Models\Connector\Ports\IDrivingCyclePort.cs" />
<Compile Include="Models\SimulationComponent\Impl\DistanceBasedDrivingCycle.cs" />
<Compile Include="Models\SimulationComponent\Impl\EngineOnlyAuxiliary.cs" />
<Compile Include="Models\SimulationComponent\Impl\DirectAuxiliary.cs" />
<Compile Include="Models\SimulationComponent\Impl\TimeBasedDrivingCycle.cs" />
<Compile Include="Utils\IMemento.cs" />
<Compile Include="Models\SimulationComponent\Impl\CombustionEngine.cs" />
......
......@@ -3,7 +3,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting.Web;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Impl;
using TUGraz.VectoCore.Tests.Utils;
......@@ -28,7 +27,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle
var vehicle = new VehicleContainer();
var engineData = CombustionEngineData.ReadFromFile(TestContext.DataRow["EngineFile"].ToString());
var aux = new EngineOnlyAuxiliary(vehicle, new AuxiliariesDemandAdapter(data));
var aux = new DirectAuxiliary(vehicle, new AuxiliaryCycleDataAdapter(data));
var gearbox = new EngineOnlyGearbox(vehicle);
......
......@@ -16,14 +16,16 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
[TestMethod]
public void TestEngineOnly()
{
var container = new VehicleContainer();
var dataWriter = new TestModalDataWriter();
var sumWriter = new TestSumWriter();
var container = new VehicleContainer(dataWriter, sumWriter);
var cycleData = DrivingCycleData.ReadFromFileEngineOnly(@"TestData\Cycles\Coach Engine Only.vdri");
var cycle = new EngineOnlyDrivingCycle(container, cycleData);
var outPort = new MockTnOutPort();
var inPort = cycle.InShaft();
var cycleOut = cycle.OutPort();
var cycleOut = cycle.OutShaft();
inPort.Connect(outPort);
......@@ -33,12 +35,13 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
var response = cycleOut.Request(absTime, dt);
Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
var dataWriter = new TestModalDataWriter();
container.CommitSimulationStep(dataWriter);
var time = (absTime + TimeSpan.FromTicks(dt.Ticks / 2)).TotalSeconds;
var simulationInterval = dt.TotalSeconds;
container.CommitSimulationStep(time, simulationInterval);
Assert.AreEqual(absTime, outPort.AbsTime);
Assert.AreEqual(dt, outPort.Dt);
Assert.AreEqual(600.0.RPMtoRad(), outPort.AngularVelocity);
Assert.AreEqual(600.RPMtoRad(), outPort.AngularVelocity);
Assert.AreEqual(0.SI<NewtonMeter>(), outPort.Torque);
}
......@@ -58,15 +61,15 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
var absTime = TimeSpan.FromSeconds(10);
var dt = TimeSpan.FromSeconds(1);
var response = cycle.OutPort().Request(absTime, dt);
var response = cycle.OutShaft().Request(absTime, dt);
Assert.IsInstanceOfType(response, typeof(ResponseFailTimeInterval));
dt = TimeSpan.FromSeconds(0.25);
response = cycle.OutPort().Request(absTime, dt);
response = cycle.OutShaft().Request(absTime, dt);
Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
var dataWriter = new TestModalDataWriter();
container.CommitSimulationStep(dataWriter);
container.CommitSimulationStep(absTime.TotalSeconds, dt.TotalSeconds);
Assert.AreEqual(absTime, outPort.AbsTime);
Assert.AreEqual(dt, outPort.Dt);
......@@ -77,17 +80,17 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
dt = TimeSpan.FromSeconds(1);
absTime = TimeSpan.FromSeconds(500);
response = cycle.OutPort().Request(absTime, dt);
response = cycle.OutShaft().Request(absTime, dt);
Assert.IsInstanceOfType(response, typeof(ResponseFailTimeInterval));
dt = TimeSpan.FromSeconds(0.25);
for (int i = 0; i < 2; i++) {
response = cycle.OutPort().Request(absTime, dt);
response = cycle.OutShaft().Request(absTime, dt);
Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
dataWriter = new TestModalDataWriter();
container.CommitSimulationStep(dataWriter);
container.CommitSimulationStep(absTime.TotalSeconds, dt.TotalSeconds);
Assert.AreEqual(absTime, outPort.AbsTime);
Assert.AreEqual(dt, outPort.Dt);
......@@ -106,13 +109,13 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
{
var container = new VehicleContainer();
var cycleData = DrivingCycleData.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based.vdri");
var cycleData = DrivingCycleData.ReadFromFileTimeBased(@"TestData\Cycles\Coach First Cycle only.vdri");
var cycle = new TimeBasedDrivingCycle(container, cycleData);
var outPort = new MockDriverDemandOutPort();
var inPort = cycle.InPort();
var cycleOut = cycle.OutPort();
var inPort = cycle.InShaft();
var cycleOut = cycle.OutShaft();
inPort.Connect(outPort);
......@@ -124,22 +127,22 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
Assert.AreEqual(absTime, outPort.AbsTime);
Assert.AreEqual(dt, outPort.Dt);
Assert.AreEqual(0.0.SI<MeterPerSecond>(), outPort.Velocity);
Assert.AreEqual(0.SI<MeterPerSecond>(), outPort.Velocity);
Assert.AreEqual((-0.020237973).SI().GradientPercent.Cast<Radian>(), outPort.Gradient);
}
[TestMethod]
public void Test_TimeBased_TimeFieldMissing()
{
var container = new VehicleContainer();
var container = new VehicleContainer(new TestModalDataWriter(), new TestSumWriter());
var cycleData = DrivingCycleData.ReadFromFileTimeBased(@"TestData\Cycles\Cycle time field missing.vdri");
var cycle = new TimeBasedDrivingCycle(container, cycleData);
var outPort = new MockDriverDemandOutPort();
var inPort = cycle.InPort();
var cycleOut = cycle.OutPort();
var inPort = cycle.InShaft();
var cycleOut = cycle.OutShaft();
inPort.Connect(outPort);
......@@ -150,7 +153,10 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
while (cycleOut.Request(absTime, dt) is ResponseSuccess) {
Assert.AreEqual(absTime, outPort.AbsTime);
Assert.AreEqual(dt, outPort.Dt);
container.CommitSimulationStep(dataWriter);
var time = (absTime + TimeSpan.FromTicks(dt.Ticks / 2)).TotalSeconds;
var simulationInterval = dt.TotalSeconds;
container.CommitSimulationStep(time, simulationInterval);
absTime += dt;
}
......
using System.Data;
using System.IO;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Utils;
......@@ -11,85 +13,138 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
public class SimulationTests
{
private const string EngineFile = @"TestData\Components\24t Coach.veng";
private const string CycleFile = @"TestData\Cycles\Coach Engine Only.vdri";
private const string CycleFile = @"TestData\Cycles\Coach Engine Only short.vdri";
[TestMethod]
public void TestSimulationEngineOnly()
{
var job = SimulatorFactory.CreateTimeBasedEngineOnlyJob(EngineFile, CycleFile, "TestEngineOnly-result.vmod");
var resultFileName = "TestEngineOnly-result.vmod";
var job = CreateJob(resultFileName);
var container = job.GetContainer();
Assert.AreEqual(560.0.RPMtoRad(), container.EngineSpeed());
Assert.AreEqual(560.RPMtoRad(), container.EngineSpeed());
Assert.AreEqual(0U, container.Gear());
try {
container.VehicleSpeed();
Assert.Fail(
"Access to Vehicle speed should fail, because there should be no vehicle in EngineOnly Mode.");
} catch (VectoException ex) {
Assert.AreEqual(ex.Message, "no vehicle available!", "Vehicle speed wrong exception message.");
}
}
[TestMethod]
public void TestEngineOnly_JobRun()
{
var resultFileName = "TestEngineOnly_JobRun-result.vmod";
var expectedResultsName = @"TestData\Results\EngineOnlyCycles\24tCoach_EngineOnly.vmod";
var expectedResultsName = @"TestData\Results\EngineOnlyCycles\24tCoach_EngineOnly short.vmod";
var job = SimulatorFactory.CreateTimeBasedEngineOnlyJob(EngineFile, CycleFile, resultFileName);
var job = CreateJob(resultFileName);
job.Run();
var results = ModalResults.ReadFromFile(resultFileName);
var expectedResults = ModalResults.ReadFromFile(expectedResultsName);
Assert.AreEqual(expectedResults.Rows.Count, results.Rows.Count, "Moddata: Row count differs.");
for (var i = 0; i < expectedResults.Rows.Count; i++) {
var row = results.Rows[i];
var expectedRow = expectedResults.Rows[i];
foreach (DataColumn col in expectedResults.Columns) {
Assert.AreEqual(expectedRow[col], row[col], "Moddata: Value differs (Row {0}, Col {1}): {2} != {3}");
}
}
}
[TestMethod]
public void TestEngineOnly_SimulatorRun()
{
var sim = new JobContainer();
var job = SimulatorFactory.CreateTimeBasedEngineOnlyJob(EngineFile, CycleFile,
"TestEngineOnly-SimulatorRun-result.vmod");
var resultFileName = "TestEngineOnly_SimulatorRun-result.vmod";
var expectedResultsName = @"TestData\Results\EngineOnlyCycles\24tCoach_EngineOnly short.vmod";
var job = CreateJob(resultFileName);
var sim = new JobContainer(new TestSumWriter());
sim.AddJob(job);
sim.RunSimulation();
sim.RunJobs();
// todo: Add additional assertions.
Assert.Fail("Todo: Add additional assertions.");
var results = ModalResults.ReadFromFile(resultFileName);
var expectedResults = ModalResults.ReadFromFile(expectedResultsName);
Assert.AreEqual(expectedResults.Rows.Count, results.Rows.Count, "Moddata: Row count differs.");
}
public IVectoSimulator CreateJob(string resultFileName)
{
var sumFileName = resultFileName.Substring(0, resultFileName.Length - 4) + "vsum";
if (File.Exists(resultFileName)) {
File.Delete(resultFileName);
}
if (File.Exists(sumFileName)) {
File.Delete(sumFileName);
}
var dataWriter = new ModalDataWriter(resultFileName);
var sumWriter = new SummaryFileWriter(sumFileName);
var job = SimulatorFactory.CreateTimeBasedEngineOnlyJob(EngineFile, CycleFile, dataWriter, sumWriter);
return job;
}
[TestMethod]
public void TestEngineOnly_MultipleJobs()
{
var simulation = new JobContainer();
var resultFiles = new[] {
@"TestEngineOnly-MultipleJobs-result1",
@"TestEngineOnly-MultipleJobs-result2",
@"TestEngineOnly-MultipleJobs-result3"
};
var expectedResultsName = @"TestData\Results\EngineOnlyCycles\24tCoach_EngineOnly short.vmod";
var expectedResults = ModalResults.ReadFromFile(expectedResultsName);
var sim1 = SimulatorFactory.CreateTimeBasedEngineOnlyJob(EngineFile, CycleFile,
"TestEngineOnly-MultipleJobs-result1.vmod");
simulation.AddJob(sim1);
var simulation = new JobContainer(new TestSumWriter());
foreach (var resultFile in resultFiles) {
simulation.AddJob(CreateJob(resultFile));
}
var sim2 = SimulatorFactory.CreateTimeBasedEngineOnlyJob(EngineFile, CycleFile,
"TestEngineOnly-MultipleJobs-result2.vmod");
simulation.AddJob(sim2);
resultFiles = resultFiles.Select(x => x + "_Coach Engine Only short.vmod").ToArray();
var sim3 = SimulatorFactory.CreateTimeBasedEngineOnlyJob(EngineFile, CycleFile,
"TestEngineOnly-MultipleJobs-result3.vmod");
simulation.AddJob(sim3);
simulation.RunJobs();
simulation.RunSimulation();
foreach (var resultFile in resultFiles) {
var results = ModalResults.ReadFromFile(resultFile);
Assert.AreEqual(expectedResults.Rows.Count, results.Rows.Count, "Moddata: Row count differs.");
}
}
[TestMethod]
public void Test_VectoJob()
{
//run jobs
var jobData = VectoJobData.ReadFromFile(@"TestData\Jobs\24t Coach.vecto");
var jobContainer = new JobContainer(jobData);
jobContainer.RunJobs();
// check sum file
var expectedSumFile = @"TestData\Results\EngineOnlyCycles\24t Coach.vsum";
var sumFile = @"TestData\Jobs\24t Coach.vsum";
Assert.IsTrue(File.Exists(sumFile), "sum file is missing: " + sumFile);
Assert.AreEqual(File.ReadAllLines(sumFile).Length, File.ReadAllLines(expectedSumFile).Length,
string.Format("sum file row count differs. Expected File: {0}, Actual File: {1}", expectedSumFile, sumFile));
// check vmod files
var expectedResultFiles = new[] {
@"TestData\Results\EngineOnlyCycles\24t Coach_Engine Only1.vmod",
@"TestData\Results\EngineOnlyCycles\24t Coach_Engine Only2.vmod",
@"TestData\Results\EngineOnlyCycles\24t Coach_Engine Only3.vmod"
};
var resultFiles = expectedResultFiles.Select(x => Path.GetFileName(x));
foreach (var result in resultFiles) {
Assert.IsTrue(File.Exists(result), "vmod file is missing: " + result);
}
var resultFileIt = resultFiles.GetEnumerator();
// todo: Add additional assertions.
Assert.Fail("Todo: Add additional assertions.");
foreach (var expectedResultFile in expectedResultFiles) {
resultFileIt.MoveNext();
var results = ModalResults.ReadFromFile(resultFileIt.Current);
var expectedResults = ModalResults.ReadFromFile(expectedResultFile);
Assert.AreEqual(expectedResults.Rows.Count, results.Rows.Count,
string.Format("Moddata: Row count differs. Expected File: {0}, Actual File: {1}", expectedResultFile,
resultFileIt.Current));
}
}
}
}
\ No newline at end of file
using TUGraz.VectoCore.Models.Simulation.Data;
namespace TUGraz.VectoCore.Tests.Models.Simulation
{
public class TestSumWriter : ISummaryDataWriter
{
public void Write(IModalDataWriter data, string jobFileName, string jobName, string cycleFileName, double vehicleMass,
double vehicleLoading) {}
public void Finish() {}
}
}
\ No newline at end of file
using System;
using System.Globalization;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
......@@ -24,6 +25,24 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
AppDomain.CurrentDomain.SetData("DataDirectory", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
}
/// <summary>
/// Assert an expected Exception.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
/// <param name="message"></param>
public static void AssertException<T>(Action func, string message = null) where T : Exception
{
try {
func();
Assert.Fail("Expected Exception {0}, but no exception occured.", typeof(T));
} catch (T ex) {
if (message != null) {
Assert.AreEqual(message, ex.Message);
}
}
}
[TestMethod]
public void TestEngineHasOutPort()
{
......@@ -49,7 +68,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
var absTime = new TimeSpan(seconds: 0, minutes: 0, hours: 0);
var dt = new TimeSpan(seconds: 1, minutes: 0, hours: 0);
var torque = 400.SI<NewtonMeter>();
var engineSpeed = 1500.0.RPMtoRad();
var engineSpeed = 1500.RPMtoRad();
port.Request(absTime, dt, torque, engineSpeed);
}
......@@ -67,7 +86,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
var dt = new TimeSpan(seconds: 1, minutes: 0, hours: 0);
var torque = 0.SI<NewtonMeter>();
var engineSpeed = 600.0.RPMtoRad();
var engineSpeed = 600.RPMtoRad();
var dataWriter = new TestModalDataWriter();
for (var i = 0; i < 21; i++) {
......@@ -209,5 +228,38 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
engineData.WriteToFile("engineData test output.veng");
}
[TestMethod]
public void Test_EngineData()
{
var engineData = CombustionEngineData.ReadFromFile(CoachEngine);
var motorway = engineData.WHTCMotorway;
Assert.AreEqual(motorway.Double(), 0);
Assert.IsTrue(motorway.HasEqualUnit(new SI().Kilo.Gramm.Per.Watt.Second.ConvertTo()));
var rural = engineData.WHTCRural;
Assert.AreEqual(rural.Double(), 0);
Assert.IsTrue(rural.HasEqualUnit(new SI().Kilo.Gramm.Per.Watt.Second.ConvertTo()));
var urban = engineData.WHTCUrban;
Assert.AreEqual(urban.Double(), 0);
Assert.IsTrue(urban.HasEqualUnit(new SI().Kilo.Gramm.Per.Watt.Second.ConvertTo()));
var displace = engineData.Displacement;
Assert.AreEqual(0.01273, displace.Double());
Assert.IsTrue(displace.HasEqualUnit(new SI().Cubic.Meter));
var inert = engineData.Inertia;
Assert.AreEqual(3.8, inert.Double(), 0.00001);
Assert.IsTrue(inert.HasEqualUnit(new SI().Kilo.Gramm.Square.Meter));
var idle = engineData.IdleSpeed;
Assert.AreEqual(58.6430628670095, idle.Double(), 0.000001);
Assert.IsTrue(idle.HasEqualUnit(0.SI<PerSecond>()));
var flc0 = engineData.GetFullLoadCurve(0);
AssertException<KeyNotFoundException>(() => { var flc10000 = engineData.GetFullLoadCurve(1000); });
}
}
}
\ No newline at end of file
......@@ -17,9 +17,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
{
var fldCurve = FullLoadCurve.ReadFromFile(CoachEngineFLD);
Assert.AreEqual(1180, (double) fldCurve.FullLoadStationaryTorque(560.0.RPMtoRad()), Tolerance);
Assert.AreEqual(1352, (double) fldCurve.FullLoadStationaryTorque(2000.0.RPMtoRad()), Tolerance);
Assert.AreEqual(1231, (double) fldCurve.FullLoadStationaryTorque(580.0.RPMtoRad()), Tolerance);
Assert.AreEqual(1180, (double) fldCurve.FullLoadStationaryTorque(560.RPMtoRad()), Tolerance);
Assert.AreEqual(1352, (double) fldCurve.FullLoadStationaryTorque(2000.RPMtoRad()), Tolerance);
Assert.AreEqual(1231, (double) fldCurve.FullLoadStationaryTorque(580.RPMtoRad()), Tolerance);
}
[TestMethod]
......@@ -34,9 +34,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
{
var fldCurve = FullLoadCurve.ReadFromFile(CoachEngineFLD);
Assert.AreEqual(69198.814183, (double) fldCurve.FullLoadStationaryPower(560.0.RPMtoRad()), Tolerance);
Assert.AreEqual(283162.218372, (double) fldCurve.FullLoadStationaryPower(2000.0.RPMtoRad()), Tolerance);
Assert.AreEqual(74767.810760, (double) fldCurve.FullLoadStationaryPower(580.0.RPMtoRad()), Tolerance);
Assert.AreEqual(69198.814183, (double) fldCurve.FullLoadStationaryPower(560.RPMtoRad()), Tolerance);
Assert.AreEqual(283162.218372, (double) fldCurve.FullLoadStationaryPower(2000.RPMtoRad()), Tolerance);
Assert.AreEqual(74767.810760, (double) fldCurve.FullLoadStationaryPower(580.RPMtoRad()), Tolerance);
}
[TestMethod]
......@@ -44,11 +44,11 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
{
var fldCurve = FullLoadCurve.ReadFromFile(CoachEngineFLD);
Assert.AreEqual(-149, (double) fldCurve.DragLoadStationaryTorque(560.0.RPMtoRad()), Tolerance);
Assert.AreEqual(-301, (double) fldCurve.DragLoadStationaryTorque(2000.0.RPMtoRad()), Tolerance);
Assert.AreEqual(-148.5, (double) fldCurve.DragLoadStationaryTorque(580.0.RPMtoRad()), Tolerance);
Assert.AreEqual(-150, (double) fldCurve.DragLoadStationaryTorque(520.0.RPMtoRad()), Tolerance);
Assert.AreEqual(-339, (double) fldCurve.DragLoadStationaryTorque(2200.0.RPMtoRad()), Tolerance);
Assert.AreEqual(-149, (double) fldCurve.DragLoadStationaryTorque(560.RPMtoRad()), Tolerance);
Assert.AreEqual(-301, (double) fldCurve.DragLoadStationaryTorque(2000.RPMtoRad()), Tolerance);
Assert.AreEqual(-148.5, (double) fldCurve.DragLoadStationaryTorque(580.RPMtoRad()), Tolerance);
Assert.AreEqual(-150, (double) fldCurve.DragLoadStationaryTorque(520.RPMtoRad()), Tolerance);
Assert.AreEqual(-339, (double) fldCurve.DragLoadStationaryTorque(2200.RPMtoRad()), Tolerance);
}
[TestMethod]
......@@ -56,9 +56,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
{
var fldCurve = FullLoadCurve.ReadFromFile(CoachEngineFLD);
Assert.AreEqual(-8737.81636, (double) fldCurve.DragLoadStationaryPower(560.0.RPMtoRad()), Tolerance);
Assert.AreEqual(-63041.29254, (double) fldCurve.DragLoadStationaryPower(2000.0.RPMtoRad()), Tolerance);
Assert.AreEqual(-9019.51251, (double) fldCurve.DragLoadStationaryPower(580.0.RPMtoRad()), Tolerance);
Assert.AreEqual(-8737.81636, (double) fldCurve.DragLoadStationaryPower(560.RPMtoRad()), Tolerance);
Assert.AreEqual(-63041.29254, (double) fldCurve.DragLoadStationaryPower(2000.RPMtoRad()), Tolerance);
Assert.AreEqual(-9019.51251, (double) fldCurve.DragLoadStationaryPower(580.RPMtoRad()), Tolerance);
}
[TestMethod]
......@@ -66,9 +66,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
{
var fldCurve = FullLoadCurve.ReadFromFile(CoachEngineFLD);
Assert.AreEqual(0.6, (double) fldCurve.PT1(560.0.RPMtoRad()), Tolerance);
Assert.AreEqual(0.25, (double) fldCurve.PT1(2000.0.RPMtoRad()), Tolerance);
Assert.AreEqual(0.37, (double) fldCurve.PT1(1700.0.RPMtoRad()), Tolerance);
Assert.AreEqual(0.6, (double) fldCurve.PT1(560.RPMtoRad()), Tolerance);
Assert.AreEqual(0.25, (double) fldCurve.PT1(2000.RPMtoRad()), Tolerance);
Assert.AreEqual(0.37, (double) fldCurve.PT1(1700.RPMtoRad()), Tolerance);
}
/// <summary>
......
{
"Header": {
"CreatedBy": "Raphael Luz IVT TU-Graz (85407225-fc3f-48a8-acda-c84a05df6837)",
"Date": "29.07.2014 16:59:13",
"AppVersion": "2.0.4-beta",
"FileVersion": 5
},
"Body": {
"SavedInDeclMode": false,
"VehCat": "Coach",
"CurbWeight": 15700.0,
"CurbWeightExtra": 0.0,
"Loading": 3300.0,
"MassMax": 24.0,
"Cd": 0.441,
"CrossSecArea": 7.4,
"rdyn": 520.0,
"Rim": "-",
"CdCorrMode": "CdOfV",
"CdCorrFile": "24t Coach.vcdv",
"Retarder": {
"Type": "Secondary",
"Ratio": 1.0,
"File": "Retarder.vrlm"
},
"AxleConfig": {
"Type": "6x2",
"Axles": [
{
"Inertia": 21.66667,
"Wheels": "-",
"AxleWeightShare": 0.4375,
"TwinTyres": false,
"RRCISO": 0.0055,
"FzISO": 62538.75
},
{
"Inertia": 10.83333,
"Wheels": "-",
"AxleWeightShare": 0.375,
"TwinTyres": true,
"RRCISO": 0.0065,
"FzISO": 52532.55
},
{
"Inertia": 21.66667,
"Wheels": "-",
"AxleWeightShare": 0.1875,
"TwinTyres": false,
"RRCISO": 0.0055,
"FzISO": 62538.75
}
]
}
}
}
\ No newline at end of file
Transmission ration to engine rpm [-]
4.078
Efficiency to engine [-]
0.96
Efficiency auxiliary to supply [-]
1
Auxiliary speed [rpm], Mechanical power [kW],Supply power [kW]
1415,0.07,0
1415,0.87,0.53
1415,1.03,0.64
1415,1.17,0.75
1416,1.36,0.84
1416,2.4,1.4
1887,0.07,0
1887,0.68,0.41
1887,0.87,0.54
1887,0.99,0.64
1887,1.1,0.74
1887,2.11,1.47
1887,2.55,1.74
2358,0.07,0
2358,0.65,0.38
2358,0.79,0.49
2358,0.99,0.64
2358,1.12,0.75
2358,1.59,1.12
2358,1.99,1.42
2358,2.41,1.68
2358,2.86,1.95
2358,3.19,2.12
2358,3.51,2.3
2830,0.08,0
2830,0.7,0.41
2830,0.83,0.51
2830,1.02,0.66
2830,1.12,0.75
2830,1.6,1.13
2830,2.45,1.71
2830,2.96,2.02
2830,3.38,2.24
2830,3.8,2.46
2830,4.14,2.63
3302,0.08,0
3302,0.74,0.44
3302,0.88,0.54
3302,1.07,0.69
3302,1.19,0.79
3302,2.45,1.71
3302,2.98,2.03
3302,3.44,2.28
3302,3.88,2.51
3302,4.46,2.8
3773,0.09,0
3773,0.8,0.47
3773,0.93,0.57
3773,1.15,0.74
3773,1.27,0.85
3773,2.44,1.69
3773,2.98,2.02
3773,3.46,2.29
3773,3.96,2.55
3773,4.47,2.8
3773,4.69,2.91
4245,0.11,0
4245,0.88,0.51
4245,1.02,0.62
4245,1.22,0.78
4245,1.47,0.98
4245,2.36,1.62
4245,2.98,2.01
4245,3.46,2.28
4245,4,2.57
4245,4.47,2.79
4245,4.94,3
4716,0.12,0
4716,0.97,0.56
4716,1.11,0.67
4716,1.32,0.84
4716,1.91,1.29
4716,2.96,1.99
4716,3.46,2.27
4716,4,2.56
4716,4.52,2.81
4716,4.97,3
4716,5.12,3.08
5188,0.14,0
5188,1.08,0.62
5188,1.21,0.73
5188,1.47,0.93
5188,2.89,1.92
5188,3.45,2.25
5188,3.99,2.54
5188,4.54,2.82
5188,4.98,3
5188,5.19,3.11
5660,0.17,0
5660,1.19,0.67
5660,1.32,0.79
5660,1.69,1.07
5660,2.54,1.66
5660,3.37,2.18
5660,3.98,2.52
5660,4.55,2.8
5660,5.02,3.01
5660,5.27,3.14
6131,0.19,0
6131,1.28,0.72
6131,1.49,0.88
6131,2.15,1.37
6131,3.19,2.04
6131,3.92,2.46
6131,4.48,2.75
6131,5.44,3.16
6603,0.22,0
6603,1.42,0.79
6603,1.81,1.08
6603,2.92,1.84
6603,3.75,2.33
6603,4.38,2.66
6603,4.94,2.92
6603,5.51,3.19
7075,0.25,0
7075,1.63,0.91
7075,2.35,1.43
7075,3.43,2.1
7075,4.24,2.55
7075,4.82,2.83
7075,5.54,3.19
7546,0.28,0
7546,1.93,1.09
7546,3.04,1.82
7546,4.09,2.43
7546,4.69,2.73
7546,5.7,3.19
9150,0.42,0
9150,5.74,3.19
12000,0.42,0
12000,5.74,3.19
v [km/h],acc [m/s],dec [m/s]
0,1.01570922360353,-0.231742702878269
5,1.38546581120225,-0.45346198022574
10,1.34993329755465,-0.565404125020508
15,1.29026714002479,-0.703434814668512
20,1.16369598822194,-0.677703399378421
25,1.04024417156355,-0.63631961226452
30,0.910278494884728,-0.548894523516266
35,0.785875078338323,-0.453995336940216
40,0.69560012996407,-0.385460695652016
45,0.648984223443223,-0.349181329186105
50,0.594249623931624,-0.309125096967231
55,0.559156929181929,-0.296716093796643
60,0.541508805860806,-0.270229542673924
65,0.539582904761905,-0.256408113084341
70,0.539103523809524,-0.217808535739946
75,0.529581598997494,-0.18609307386602
80,0.496418462064251,-0.142683384645006
85,0.453932619248656,-0.117950211164234
90,0.397824554210839,-0.102997621205622
95,0.33969661577071,-0.102997621205622
100,0.289428370365158,-0.102997621205622
105,0.256471472751248,-0.102997621205622
110,0.24,-0.102997621205622
115,0.22,-0.102997621205622
120,0.2,-0.102997621205622
<n>,<Pe>
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,-2.38E-07
600,-2.38E-07
600,0
600,0
600,0
600,0
600,0
600,0
600,-2.38E-07
600,2.38E-07
600,0
644.4445,2.329973
644.4445,0.5693641
644.4445,4.264177
869.7512,7.98456
644.4445,1.351656
1015.31,-0.2716608
948.6478,-0.4653716
872.4501,-0.5719776
644.4445,1.012361
816.044,0.1606398
644.4445,3.967641
644.4445,4.3916
645.3466,1.254886
602.9238,0.36098
644.4445,1.097353
644.4445,1.476951
645.6951,2.961375
656.8193,3.33839
688.8293,2.509675
715.7259,3.104633
743.2361,2.779576
759.3434,2.025352
763.0762,1.467997
761.0308,1.383811
757.7582,1.320618
755.406,1.475238
756.3265,1.681716
753.872,1.098228
749.1166,1.411724
747.787,1.465289
743.7986,1.110595
691.6417,-3.012229
627.2637,-0.1685431
1049.495,-0.09707546
644.4445,1.615664
1026.825,0.4667768
977.9754,-0.4151859
906.5457,-0.4785028
764.8557,-2.495939
615.8789,-0.5095253
600,-0.2679868
644.4445,0.5701756
644.4445,1.185031
600,0.2967396
646.6069,3.811063
895.4804,7.923037
653.8535,6.359474
791.9158,11.55912
900.8318,4.931076
1007.856,14.46236
1156.708,13.49057
1345.086,27.20026
1602.138,35.01208
1888.49,46.58702
2103.714,24.29906
2146.359,-1.109985
1286.033,8.800848
1351.937,37.56419
1494.108,56.84015
1650.18,55.71647
1797.949,62.99876
1974.041,90.22348
2191.804,115.1789
2403.877,105.9852
2503.301,18.33513
1611.144,-1.709167
1619.774,43.61679
1655.685,42.16265
1690.462,44.19933
1723.907,42.2117
1766.618,62.7349
1823.327,70.33007
1898.131,102.0343
1980.033,91.64824
2027.516,42.57878
2040.799,27.31307
1396.846,69.06043
1435.803,91.8233
1479.637,89.72998
1511.026,58.87632
1535.129,70.88527
1563.544,76.08076
1591.288,72.46291
1615.981,69.52535
1637.034,63.16708
1654.957,61.31534
1674.975,72.86595
1695.262,64.75288
1709.799,54.75394
1712.769,24.54955
1702.061,5.766651
1685.925,4.414207
1669.991,5.575367
1656.502,12.07608
1644.88,11.30247
1634.482,15.56817
1624.607,12.47053
1610.151,-0.5362444
1594.136,6.376687
1580.163,5.485111
1564.78,1.025784
1550.539,8.4501
1539.777,11.6633
1532.066,17.71403
1521.599,2.418658
1504.309,-4.049212
1481.361,-14.07779
1453.792,-17.15281
1423.724,-18.15207
1385.246,-16.81612
1337.242,-15.72801
1293.188,-15.42869
1281.755,38.3059
1286.484,11.6914
1283.596,17.9171
1285.597,24.78118
1291.778,29.405
1303.359,40.06316
1321.147,47.6144
1343.046,53.40984
1367.31,56.75732
1398.372,76.35516
1441.017,95.91759
1491.115,106.3325
1533.099,77.92695
1561.824,69.6596
1584.033,60.08042
1597.119,41.62484
1603.93,40.29163
1607.558,31.45644
1604.965,19.52167
1600.142,23.70411
1596.299,22.48869
1589.192,12.48158
1578.793,11.02395
1566.889,6.910674
1551.426,-1.123854
1528.707,-15.20682
1502.589,-11.37927
1476.041,-16.47795
1439.148,-17.79036
1386.845,-16.22873
1331.801,-15.54598
1276.609,-14.19835
1222.116,-13.53877
1183.826,-13.63705
1165.594,4.323093
1154.524,-0.2198782
1145.307,8.251244
1136.212,-0.1459947
1127.318,8.395197
1127.425,20.90548
1132.316,19.78157
1134.976,15.85121
1140.847,27.66578
1153.503,32.64259
1173.508,46.8272
1195.77,39.98267
1214.31,39.54551
1235.31,48.15401
1262.019,56.77373
1290.77,56.59818
1317.063,53.30949
1343.879,61.21212
1364.448,38.20493
1372.416,26.90753
1376.097,26.42333
1374.269,11.18833
1368.546,15.03598
1362.863,11.02519
1356.038,11.46854
1346.136,1.988382
1325.11,-16.2194
1284.63,-14.65078
1238.373,-14.2102
1193.929,-12.98282
1155.988,-13.10039
1137.273,2.958799
1132.786,15.8914
1141.075,33.33242
1156.7,34.19608
1179.433,52.38899
1213.827,66.11726
1258.176,83.05579
1305.898,81.63163
1353.754,91.2124
1396.935,75.19558
1438.893,94.76639
1487.004,100.8023
1529.298,83.95088
1563.974,82.77102
1596.393,81.57443
1624.446,72.54066
1640.138,42.54347
1643,29.84203
1638.257,16.47232
1629.605,16.00256
1630.478,48.60144
1642.785,55.60721
1656.623,55.29026
1669.48,53.73763
1680.188,49.11893
1689.163,48.75134
1695.907,42.08216
1700.851,42.99605
1706.79,46.16529
1713.763,47.34768
1720.427,45.77478
1727.319,48.89489
1725.733,15.54477
1714.932,15.2667
1703.74,13.40421
1690.842,8.433504
1676.749,8.346373
1663.421,10.28855
1648.951,3.619027
1633.192,5.002003
1617.433,2.826547
1602.775,7.905733
1589.501,6.74611
1576.428,7.864722
1567.118,18.46364
1564.686,30.00007
1567.427,35.38074
1572.196,36.95614
1576.469,34.14531
1576.307,22.5677
1570.826,16.47429
1563.423,15.84486
1553.562,7.964062
1536.916,-5.952643
1517.233,-2.275624
1497.389,-6.935693
1471.863,-18.41763
1442.372,-18.13165
1414.871,-13.40553
1387.812,-17.13374
1362.057,-10.3961
1346.257,8.515593
1345.787,31.16553
1358.712,46.74545
1379.066,53.84549
1401.382,54.66264
1424.557,58.96523
1447.437,56.39186
1469.605,59.47992
1493.117,63.22589
1515.124,57.4621
1535.841,61.76757
1557.969,64.56117
1578.323,58.54613
1596.594,60.07353
1611.991,50.88236
1621.194,40.61778
1619.421,14.21795
1605.113,-1.868717
1588.762,6.50421
1576.67,11.31663
1569.348,21.61535
1567.91,30.3064
1571.135,36.95245
1576.267,36.91877
1582.797,42.09142
1590.294,40.76203
1597.817,42.91198
1605.462,41.89369
1612.273,40.82465
1619.582,44.26139
1628.167,45.92483
1637.464,47.59579
1648.723,53.73099
1661.419,53.84293
1676.91,65.1045
1695.235,65.79607
1711.21,58.91008
1724.968,59.73791
1739.437,63.20061
1753.772,61.00745
1768,64.61153
1781.368,59.52817
1794.521,65.5128
1809.072,66.50668
1818.449,47.4547
1817.24,26.92148
1805.995,8.979017
1786.662,-4.010155
1765.233,-0.05493259
\ No newline at end of file
<t>,<v>,<grad>,<n>,<Padd>,<Aux_ALT1>,<Aux_ALT2>,<Aux_ALT3>
0,0,-0.020237973,2,6.1,0.25,0.25,0.25
\ No newline at end of file
<n>,<Pe>
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,-2.38E-07
600,-2.38E-07
600,0
600,0
600,0
600,0
600,0
600,0
600,-2.38E-07
600,2.38E-07
600,0
644.4445,2.329973
644.4445,0.5693641
644.4445,4.264177
869.7512,7.98456
644.4445,1.351656
1015.31,-0.2716608
948.6478,-0.4653716
872.4501,-0.5719776
644.4445,1.012361
816.044,0.1606398
644.4445,3.967641
644.4445,4.3916
645.3466,1.254886
602.9238,0.36098
644.4445,1.097353
644.4445,1.476951
645.6951,2.961375
656.8193,3.33839
688.8293,2.509675
715.7259,3.104633
743.2361,2.779576
759.3434,2.025352
763.0762,1.467997
761.0308,1.383811
757.7582,1.320618
755.406,1.475238
756.3265,1.681716
753.872,1.098228
749.1166,1.411724
747.787,1.465289
743.7986,1.110595
691.6417,-3.012229
627.2637,-0.1685431
1049.495,-0.09707546
644.4445,1.615664
1026.825,0.4667768
977.9754,-0.4151859
906.5457,-0.4785028
764.8557,-2.495939
615.8789,-0.5095253
600,-0.2679868
644.4445,0.5701756
644.4445,1.185031
600,0.2967396
646.6069,3.811063
895.4804,7.923037
653.8535,6.359474
791.9158,11.55912
900.8318,4.931076
1007.856,14.46236
1156.708,13.49057
1345.086,27.20026
1602.138,35.01208
1888.49,46.58702
2103.714,24.29906
2146.359,-1.109985
1286.033,8.800848
1351.937,37.56419
1494.108,56.84015
1650.18,55.71647
1797.949,62.99876
1974.041,90.22348
2191.804,115.1789
2403.877,105.9852
2503.301,18.33513
1611.144,-1.709167
1619.774,43.61679
1655.685,42.16265
1690.462,44.19933
1723.907,42.2117
1766.618,62.7349
1823.327,70.33007
1898.131,102.0343
1980.033,91.64824
2027.516,42.57878
2040.799,27.31307
1396.846,69.06043
1435.803,91.8233
1479.637,89.72998
1511.026,58.87632
1535.129,70.88527
1563.544,76.08076
1591.288,72.46291
1615.981,69.52535
1637.034,63.16708
1654.957,61.31534
1674.975,72.86595
1695.262,64.75288
1709.799,54.75394
1712.769,24.54955
1702.061,5.766651
1685.925,4.414207
1669.991,5.575367
1656.502,12.07608
1644.88,11.30247
1634.482,15.56817
1624.607,12.47053
1610.151,-0.5362444
1594.136,6.376687
1580.163,5.485111
1564.78,1.025784
1550.539,8.4501
1539.777,11.6633
1532.066,17.71403
1521.599,2.418658
1504.309,-4.049212
1481.361,-14.07779
1453.792,-17.15281
1423.724,-18.15207
1385.246,-16.81612
1337.242,-15.72801
1293.188,-15.42869
1281.755,38.3059
1286.484,11.6914
1283.596,17.9171
1285.597,24.78118
1291.778,29.405
1303.359,40.06316
1321.147,47.6144
1343.046,53.40984
1367.31,56.75732
1398.372,76.35516
1441.017,95.91759
1491.115,106.3325
1533.099,77.92695
1561.824,69.6596
1584.033,60.08042
1597.119,41.62484
1603.93,40.29163
1607.558,31.45644
1604.965,19.52167
1600.142,23.70411
1596.299,22.48869
1589.192,12.48158
1578.793,11.02395
1566.889,6.910674
1551.426,-1.123854
1528.707,-15.20682
1502.589,-11.37927
1476.041,-16.47795
1439.148,-17.79036
1386.845,-16.22873
1331.801,-15.54598
1276.609,-14.19835
1222.116,-13.53877
1183.826,-13.63705
1165.594,4.323093
1154.524,-0.2198782
1145.307,8.251244
1136.212,-0.1459947
1127.318,8.395197
1127.425,20.90548
1132.316,19.78157
1134.976,15.85121
1140.847,27.66578
1153.503,32.64259
1173.508,46.8272
1195.77,39.98267
1214.31,39.54551
1235.31,48.15401
1262.019,56.77373
1290.77,56.59818
1317.063,53.30949
1343.879,61.21212
1364.448,38.20493
1372.416,26.90753
1376.097,26.42333
1374.269,11.18833
1368.546,15.03598
1362.863,11.02519
1356.038,11.46854
1346.136,1.988382
1325.11,-16.2194
1284.63,-14.65078
1238.373,-14.2102
1193.929,-12.98282
1155.988,-13.10039
1137.273,2.958799
1132.786,15.8914
1141.075,33.33242
1156.7,34.19608
1179.433,52.38899
1213.827,66.11726
1258.176,83.05579
1305.898,81.63163
1353.754,91.2124
1396.935,75.19558
1438.893,94.76639
1487.004,100.8023
1529.298,83.95088
1563.974,82.77102
1596.393,81.57443
1624.446,72.54066
1640.138,42.54347
1643,29.84203
1638.257,16.47232
1629.605,16.00256
1630.478,48.60144
1642.785,55.60721
1656.623,55.29026
1669.48,53.73763
1680.188,49.11893
1689.163,48.75134
1695.907,42.08216
1700.851,42.99605
1706.79,46.16529
1713.763,47.34768
1720.427,45.77478
1727.319,48.89489
1725.733,15.54477
1714.932,15.2667
1703.74,13.40421
1690.842,8.433504
1676.749,8.346373
1663.421,10.28855
1648.951,3.619027
1633.192,5.002003
1617.433,2.826547
1602.775,7.905733
1589.501,6.74611
1576.428,7.864722
1567.118,18.46364
1564.686,30.00007
1567.427,35.38074
1572.196,36.95614
1576.469,34.14531
1576.307,22.5677
1570.826,16.47429
1563.423,15.84486
1553.562,7.964062
1536.916,-5.952643
1517.233,-2.275624
1497.389,-6.935693
1471.863,-18.41763
1442.372,-18.13165
1414.871,-13.40553
1387.812,-17.13374
1362.057,-10.3961
1346.257,8.515593
1345.787,31.16553
1358.712,46.74545
1379.066,53.84549
1401.382,54.66264
1424.557,58.96523
1447.437,56.39186
1469.605,59.47992
1493.117,63.22589
1515.124,57.4621
1535.841,61.76757
1557.969,64.56117
1578.323,58.54613
1596.594,60.07353
1611.991,50.88236
1621.194,40.61778
1619.421,14.21795
1605.113,-1.868717
1588.762,6.50421
1576.67,11.31663
1569.348,21.61535
1567.91,30.3064
1571.135,36.95245
1576.267,36.91877
1582.797,42.09142
1590.294,40.76203
1597.817,42.91198
1605.462,41.89369
1612.273,40.82465
1619.582,44.26139
1628.167,45.92483
1637.464,47.59579
1648.723,53.73099
1661.419,53.84293
1676.91,65.1045
1695.235,65.79607
1711.21,58.91008
1724.968,59.73791
1739.437,63.20061
1753.772,61.00745
1768,64.61153
1781.368,59.52817
1794.521,65.5128
1809.072,66.50668
1818.449,47.4547
1817.24,26.92148
1805.995,8.979017
1786.662,-4.010155
1765.233,-0.05493259
1742.89,-7.886769
1721.609,2.619378
1703.539,1.704347
1687.591,9.187813
1675.688,15.12251
1669.373,28.10153
1666.148,25.54206
1659.176,14.7161
1647.474,8.565833
1631.875,0.5784202
1615.068,3.583271
1599,2.292942
1587.324,17.45128
1584.315,30.57986
1586.8,35.61685
1593.088,43.5732
1602.506,46.77898
1611.978,44.69442
1618.292,36.94254
1621.436,34.45127
1619.475,19.75505
1612.367,16.75193
1602.009,8.288825
1592.927,20.35848
1589.178,25.61557
1589.299,33.05613
1592.766,36.86369
1600.84,48.93576
1611.79,47.39437
1614.947,23.44294
1610.836,22.92943
1603.433,12.01165
1586.975,-7.003079
1563.772,-9.861372
1540.355,-8.272071
1519.907,-2.04369
1503.677,3.384114
1487.904,-1.296515
1471.513,0.8036427
1454.625,-3.150111
1435.789,-5.048037
1415.583,-7.256803
1396.787,-1.866434
1379.012,-5.011639
1361.345,-2.060575
1341.192,-11.55893
1317.613,-10.92163
1291.294,-15.20063
1254.361,-14.80647
1210.226,-14.88861
1174.65,-14.81055
1147.215,-14.28176
1119.552,-13.7853
1087.993,-13.05181
1052.511,-12.44097
1031.579,5.715624
1037.853,32.76339
1064.428,51.27643
1098.567,52.62703
1138.801,70.14542
1186.926,77.43063
1233.348,72.79241
1273.076,66.44997
1304.85,56.3991
1335.952,68.81242
1369.93,68.46135
1401.744,66.97513
1432.914,70.78075
1462.162,65.10287
1490.927,73.24111
1519.369,67.75407
1544.292,65.61349
1569.657,72.50694
1591.342,56.41633
1604.709,47.0724
1608.203,24.27454
1601.539,12.98722
1592.376,15.38727
1589.407,33.14979
1593.76,39.76634
1602.748,49.21623
1614.531,50.16054
1628.221,57.05817
1646.023,65.98457
1665.665,65.65594
1683.789,63.0876
1698.339,55.09802
1707.865,46.70007
1711.465,34.71091
1712.298,37.05171
1713.763,37.07273
1717.041,43.76989
1723.678,49.61529
1733.472,56.02866
1744.677,55.90408
1750.736,38.25808
1755.6,52.16808
1767.544,65.1767
1784.929,74.09778
1810.361,98.34163
1843.734,108.7761
1876.234,100.4823
1900.229,80.1554
1920.624,89.84477
1923.486,11.55359
1384.726,-6.716908
1365.214,-9.758064
1335.167,-15.65223
1305.561,-9.438278
1293.54,25.59272
1293.716,51.81037
1298.87,51.8591
1307.468,70.9785
1321.719,83.69244
1340.242,97.09694
1361.364,102.0721
1381.797,98.08289
1396.943,76.64746
1408.093,78.5398
1421.649,92.87965
1436.79,90.6324
1452.067,97.12432
1465.261,81.55907
1474.817,78.22183
1481.586,66.6988
1486.936,71.00793
1494.076,78.64029
1504.805,94.48131
1519.545,105.7961
1533.59,93.55258
1544.594,90.03146
1553.279,81.37687
1560.448,82.33672
1566.855,78.04972
1572.087,76.19854
1574.895,63.56385
1574.396,55.5367
1573.515,61.01888
1573.036,57.94503
1570.845,49.96451
1566.747,45.35576
1559.803,31.16218
1548.662,17.72969
1536.094,20.5824
1523.252,14.39674
1509.539,13.54565
1497.577,23.35009
1487.474,23.31975
1479.131,32.58831
1472.793,34.21489
1471.189,59.98996
1474.25,61.94712
1479.943,76.42569
1487.386,73.62328
1493.87,72.10479
1498.252,62.06528
1504.355,83.55563
1514.009,85.13411
1522.518,78.52847
1528.054,68.42541
1531.879,68.98322
1535.693,69.12019
1539.86,71.95422
1543.156,64.46819
1544.232,58.62698
1542.999,50.14769
1540.877,52.80785
1538.393,47.5109
1535.83,51.87814
1534.607,55.44809
1535.527,65.06208
1540.046,78.20454
1545.102,69.33004
1542.54,31.26162
1534.764,36.16859
1527.125,30.95866
1517.892,25.15287
1508.043,25.83571
1498.927,28.26935
1490.525,28.91031
1483.571,35.82453
1480.344,50.35513
1480.471,55.54207
1481.576,56.2795
1481.869,50.83329
1480.745,47.77131
1478.28,42.57355
1476.333,50.48153
1475.023,46.08316
1474.094,52.55144
1473.565,48.33829
1472.754,50.75901
1472.802,53.36675
1472.646,49.53503
1472.675,54.45502
1472.744,49.77462
1473.644,59.45992
1476.216,59.98241
1477.918,54.67937
1478.984,56.45734
1479.639,52.3883
1481.234,62.24279
1484.403,62.18639
1488.227,66.80893
1491.239,57.95909
1493.107,60.41497
1495.973,64.38061
1498.477,58.73077
1499.935,58.45076
1498.233,39.69763
1490.447,21.17598
1479.659,20.41969
1469.35,22.65018
1458.865,18.07665
1449.143,25.79696
1440.174,21.3046
1431.009,23.49089
1422.334,22.9997
1411.819,11.86371
1402.048,25.93449
1394.321,22.3779
1386.849,26.39423
1381.039,30.80274
1374.056,19.11548
1365.478,21.04128
1357.8,23.10369
1351.413,27.2389
1348.342,40.50266
1348.86,46.52771
1354.67,69.74982
1364.49,69.70929
1375.415,77.81886
1386.575,73.11307
1395.456,67.07029
1403.241,68.56764
1410.313,64.41555
1416.035,62.10302
1420.035,55.49044
1423.057,57.14668
1424.515,46.92026
1424.466,48.65111
1424.349,46.51535
1420.514,27.12698
1412.171,19.98239
1399.202,-0.2213111
1381.088,-8.825974
1360.959,-10.97501
1339.52,-15.13851
1315.038,-15.79168
1271.67,-13.71585
1205.943,-12.13631
1122.19,-10.03683
1048.169,-10.36391
990.1788,-9.246284
928.2859,-9.212884
867.8992,-9.020022
804.412,-8.525709
729.0021,-8.260065
887.2314,-7.793596
782.4908,-7.821894
665.2287,-6.784316
772.3559,-4.63562
600,-6.277975
614.9388,-5.288214
696.7551,-3.49948
600,-1.283326
664.3683,-1.597912
600,-1.778763
600,-0.7596555
600,-0.1736608
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,0
600,-2.38E-07
600,-2.38E-07
600,0
600,0
600,0
600,2.38E-07
600,0
600,0
600,0
600,0
600,0
600,0
600,2.38E-07
600,0
600,0
600,-2.38E-07
600,0
644.4445,1.612164
644.4445,6.538949
785.0072,0.8882241
841.1434,3.194654
644.4445,4.281434
1009.552,-0.1017489
970.5985,0.5266633
942.8003,0.3860083
644.4445,2.60547
644.4445,3.600683
614.3267,0.6870103
645.5776,1.867147
654.6205,4.423994
692.8177,1.993502
708.7716,2.477404
728.2538,2.476002
755.4572,3.501919
778.621,2.18979
785.3195,1.743106
784.5526,1.346341
785.7797,1.974449
787.5695,1.416916
784.4503,1.4051
782.5583,1.548533
779.4391,1.255069
775.604,1.452504
776.0643,1.739155
781.2288,2.003658
791.558,2.376166
794.8305,1.215703
790.2285,1.457595
788.5922,1.549223
777.0869,0.305099
717.4133,-3.12269
620.5139,-2.686603
644.4445,1.54447
1016.479,0.8481472
962.2321,-0.9291403
847.3507,-1.475364
747.673,-0.2668786
676.963,-0.3898878
602.3846,-0.3104959
600,-0.1901872
600,0.1421087
644.4445,0.9691319
658.5208,5.586625
644.4445,10.10435
770.7463,12.22105
927.217,10.38821
1058.376,12.88986
1195.672,14.52883
1370.653,24.36733
1588.996,29.57337
1850.804,44.95491
2070.22,25.92677
2149.734,8.226243
1319.83,16.38028
1416.364,49.23381
1559.182,49.06653
1710.518,65.96037
1919.854,106.5468
2084.814,43.9015
2166.125,47.40614
1477.623,84.04178
1568.573,75.32056
1632.52,51.08742
1672.844,42.69801
1694.081,22.06184
1716.868,46.75986
1754.409,48.50185
1799.228,62.44069
1858.482,78.40761
1900.06,34.26859
1927.36,55.25987
1337.101,81.45631
\ No newline at end of file
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment