diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index 666f6eba353cc442f95b976326f750875d9823fd..c175cab3cf6ca702f2bc818e8780e2babbd0765a 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -709,6 +709,10 @@ namespace TUGraz.VectoCommon.InputData public int Count { get; set; } public PowertrainPosition Position { get; set; } + + public double Ratio { get; set; } + + public double MechanicalEfficiency { get; set; } } public interface IElectricStorageDeclarationInputData diff --git a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs index 51e06d7a3a5f68166f7927000435fa1ce27510a3..dbe59c40a808ad9949a484a7942cea444c44140c 100644 --- a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs +++ b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs @@ -38,5 +38,11 @@ namespace TUGraz.VectoCommon.InputData { { return pos.ToString().Replace(HybridPrefix, "").Replace(BatteryElectriPrefix, ""); } + + public static bool IsBatteryElectric(this PowertrainPosition pos) + { + return pos == PowertrainPosition.BatteryElectricB2 || pos == PowertrainPosition.BatteryElectricB3 || + pos == PowertrainPosition.BatteryElectricB4; + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs index b4bf0ad6456fc38463dd58046fe3029c8e5340d8..e95884d2d7da030e3a1040e24151b729588cabfd 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs @@ -9,7 +9,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData { public static class ElectricFullLoadCurveReader { - public static ElectricFullLoadCurve Create(DataTable data) + public static ElectricFullLoadCurve Create(DataTable data, double ratio, int count, double efficiency) { if (data.Columns.Count < 3) { throw new VectoException("Motor FullLoadCurve Data must contain at least 3 columns"); @@ -27,9 +27,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData return new ElectricFullLoadCurve( (from DataRow row in data.Rows select new ElectricFullLoadCurve.FullLoadEntry { - MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad(), - FullDriveTorque = row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>(), - FullGenerationTorque = row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() + MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad() / ratio, + FullDriveTorque = row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>() * count * ratio * efficiency, + FullGenerationTorque = row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() * count * ratio / efficiency }).ToList()); } @@ -51,7 +51,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData public static class ElectricMotorDragCurveReader { - public static DragCurve Create(DataTable data) + public static DragCurve Create(DataTable data, double ratio, int count, double efficiency) { if (data.Columns.Count < 2) { throw new VectoException("Drag Curve must contain at least 2 columns"); @@ -66,8 +66,8 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData data.Columns[1].ColumnName = Fields.DragTorque; } return new DragCurve(data.AsEnumerable().Cast<DataRow>().Select(x => new DragCurve.DragLoadEntry() { - MotorSpeed = x.ParseDouble(Fields.MotorSpeed).RPMtoRad(), - DragTorque = x.ParseDouble(Fields.DragTorque).SI<NewtonMeter>() + MotorSpeed = x.ParseDouble(Fields.MotorSpeed).RPMtoRad() / ratio, + DragTorque = x.ParseDouble(Fields.DragTorque).SI<NewtonMeter>() * ratio * count / efficiency }).ToList()); } diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs index 4ef6d383ac000a06d06be51a2bfc4758d81541f4..27bb374a263e2bdf05db403e1b5e691739602a16 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs @@ -12,12 +12,12 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.ComponentData { public static class ElectricMotorMapReader { - public static EfficiencyMap Create(Stream data) + public static EfficiencyMap Create(Stream data, double ratio, int count, double efficiency) { - return Create(VectoCSVFile.ReadStream(data)); + return Create(VectoCSVFile.ReadStream(data), ratio, count, efficiency); } - public static EfficiencyMap Create(DataTable data) + public static EfficiencyMap Create(DataTable data, double ratio, int count, double efficiency) { var headerValid = HeaderIsValid(data.Columns); if (!headerValid) @@ -30,15 +30,23 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData { data.Columns[1].ColumnName = Fields.Torque; data.Columns[2].ColumnName = Fields.PowerElectrical; } - var delaunayMap = new DelaunayMap("ElectricMotorEfficiencyMap Mechanicla to Electric"); + var delaunayMap = new DelaunayMap("ElectricMotorEfficiencyMap Mechanical to Electric"); foreach (DataRow row in data.Rows) { try { var entry = CreateEntry(row); - delaunayMap.AddPoint(-entry.Torque.Value(), entry.MotorSpeed.Value(), -entry.PowerElectrical.Value()); + if (entry.Torque.IsGreaterOrEqual(0)) { + delaunayMap.AddPoint(-entry.Torque.Value() * count * ratio * efficiency, + entry.MotorSpeed.Value() / ratio, + -entry.PowerElectrical.Value() * count); + } else { + delaunayMap.AddPoint(-entry.Torque.Value() * count * ratio / efficiency, + entry.MotorSpeed.Value() / ratio, + -entry.PowerElectrical.Value() * count); + } } - catch (Exception e) + catch (Exception e) { throw new VectoException(string.Format("EfficiencyMap - Line {0}: {1}", data.Rows.IndexOf(row), e.Message), e); } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 041a466204d6e1795184f6a11dccf506e2d7afe6..6fd194084fed707bce4df8b550ebbc9cfaf093dd 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -650,19 +650,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } return electricMachines.Entries - .Select(x => Tuple.Create(x.Position, CreateElectricMachine(x.ElectricMachine, x.Count))).ToList(); + .Select(x => Tuple.Create(x.Position, CreateElectricMachine(x.ElectricMachine, x.Count, x.Ratio, x.MechanicalEfficiency))).ToList(); } - private ElectricMotorData CreateElectricMachine(IElectricMotorEngineeringInputData motorData, int count) + private ElectricMotorData CreateElectricMachine(IElectricMotorEngineeringInputData motorData, int count, + double ratio, double efficiency) { - if (count > 1) { - throw new VectoException("Multiple electric motors at a position are currently not supported"); - } return new ElectricMotorData() { - FullLoadCurve = ElectricFullLoadCurveReader.Create(motorData.FullLoadCurve), - DragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve), - EfficiencyMap = ElectricMotorMapReader.Create(motorData.EfficiencyMap), - Inertia = motorData.Inertia + FullLoadCurve = ElectricFullLoadCurveReader.Create(motorData.FullLoadCurve, ratio, count, efficiency), + DragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, ratio, count, efficiency), + EfficiencyMap = ElectricMotorMapReader.Create(motorData.EfficiencyMap, ratio, count, efficiency), + Inertia = motorData.Inertia, }; } } diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs index b54c4c8e5b7fa71cdea918d27a71f375617cead7..3c5854615f3ac1166014652edf729740b5d9c446 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs @@ -402,9 +402,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [ModalResultField(typeof(SI), caption: "P_em-B4_mech [kW]", outputFactor: 1e-3)] P_electricMotor_mech_B4, - // --> - [ModalResultField(typeof(SI), caption: "P_bat_T [kW]", outputFactor: 1e-3)] P_battery_terminal, + [ModalResultField(typeof(SI), caption: "P_em-B3_mech [kW]", outputFactor: 1e-3)] + P_electricMotor_mech_B3, + // --> + + [ModalResultField(typeof(SI), caption: "P_bat_T [kW]", outputFactor: 1e-3)] P_battery_terminal, [ModalResultField(typeof(SI), caption: "P_bat_int [kW]", outputFactor: 1e-3)] P_battery_int, [ModalResultField(typeof(SI), caption: "P_bat_loss [kW]", outputFactor: 1e-3)] P_battery_loss, [ModalResultField(typeof(SI), caption: "Battery SOC [%]", outputFactor: 100)] BatteryStateOfCharge, diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs index 4f85633b7c626a73ee2f6c2b79fa53b90fd330f1..d590da8402408d5835aaaeb5f1aecd655d774b62 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs @@ -84,6 +84,8 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus { bool HasCombustionEngine { get; } - //PowertrainArchitecture A + bool HasElectricMotor { get; } + + PowertrainPosition[] ElectricMotorPositions { get; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IElectricMotorInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IElectricMotorInfo.cs index 75bf5cfab80a5a87fa74e5ad769d2070c6771bbe..2398bcf7730f36f043c98c559048e102cf99abb4 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IElectricMotorInfo.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IElectricMotorInfo.cs @@ -9,5 +9,7 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus PerSecond ElectricMotorSpeed { get; } PowertrainPosition Position { get; } + PerSecond MaxSpeed { get; } + Watt DragPower(PerSecond electricMotorSpeed); } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index b89f881ed291b00429b7229ed5338ec91ef76e8d..112c9aefd9e37fbcee3e7f2586fce6e8bb896c4a 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -236,6 +236,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public virtual bool HasElectricMotor { get; private set; } + public PowertrainPosition[] ElectricMotorPositions + { + get { return ElectricMotors.Keys.ToArray(); } + } + public virtual bool HasCombustionEngine { get; private set; } public virtual bool HasGearbox { get; private set; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/EfficiencyMap.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/EfficiencyMap.cs index 21fde2ab14dcd5c305e1a4d81cb6db5c66cb17e8..c0ccf72a356337051e911de18ff294746b2625c9 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/EfficiencyMap.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/EfficiencyMap.cs @@ -6,6 +6,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { public class EfficiencyMap { private readonly DelaunayMap _efficiencyMapMech2El; + private PerSecond _maxSpeed; protected internal EfficiencyMap(DelaunayMap efficiencyMapMech2El) { @@ -109,6 +110,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { if (batPower.IsEqual(0, 1e-3)) { return null; } + + if (avgSpeed.IsGreaterOrEqual(MaxSpeed)) { + return 0.SI<NewtonMeter>(); + } var retVal = SearchAlgorithm.Search( maxEmTorque, elPowerMaxEM.ElectricalPower, maxEmTorque * 0.1, getYValue: x => { @@ -123,5 +128,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { return retVal; } + + protected PerSecond MaxSpeed + { + get { return _maxSpeed ?? (_maxSpeed = _efficiencyMapMech2El.Entries.Select(x => x.Y).Max().RPMtoRad()); } + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs index d8df6bc655785faa4cc78e209e6d206cea9db6a4..ff4b449e6e4d2c78bbb06fe465ed7310d5691e6d 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs @@ -12,5 +12,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public KilogramSquareMeter Inertia { get; internal set; } public DragCurve DragCurve { get; internal set; } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index cffac5072dd4395a2dea699257f0d476497096fa..75fae046fafaa6a7d8cb4b67b369401eb9de4a14 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -680,12 +680,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var rollResistanceForce = Driver.DataBus.VehicleInfo.RollingResistance( ((targetAltitude - vehicleAltitude) / (actionEntry.Distance - Driver.DataBus.MileageCounter.Distance)) .Value().SI<Radian>()); - var engineDragLoss = Driver.DataBus.EngineInfo.EngineDragPower(Driver.DataBus.EngineInfo.EngineSpeed); - var gearboxLoss = Driver.DataBus.GearboxInfo.GearboxLoss(); - var axleLoss = Driver.DataBus.AxlegearInfo.AxlegearLoss(); + var engineDragLoss = Driver.DataBus.PowertrainInfo.HasCombustionEngine + ? Driver.DataBus.EngineInfo.EngineDragPower(Driver.DataBus.EngineInfo.EngineSpeed) + : 0.SI<Watt>(); + + var emDragLoss = Driver.DataBus.PowertrainInfo.HasElectricMotor + ? Driver.DataBus.PowertrainInfo.ElectricMotorPositions.Select(x => Driver.DataBus.ElectricMotorInfo(x).DragPower(Driver.DataBus.ElectricMotorInfo(x).ElectricMotorSpeed)).Sum() // Driver.DataBus.ElectricMotorInfo() + : 0.SI<Watt>(); + + var gearboxLoss = Driver.DataBus.GearboxInfo?.GearboxLoss() ?? 0.SI<Watt>(); + var axleLoss = Driver.DataBus.AxlegearInfo?.AxlegearLoss() ?? 0.SI<Watt>(); var coastingResistanceForce = airDragForce + rollResistanceForce + - (gearboxLoss + axleLoss - engineDragLoss) / vehicleSpeed; + (gearboxLoss + axleLoss + emDragLoss - (engineDragLoss)) / vehicleSpeed; var coastingDecisionFactor = Driver.DriverData.LookAheadCoasting.LookAheadDecisionFactor.Lookup( targetSpeed, @@ -1001,7 +1008,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient); debug.Add(new { action = "Coast:(Success & Acc<0) -> Accelerate", first }); } - if (!DataBus.EngineInfo.EngineOn && first is ResponseOverload) { + if (DataBus.PowertrainInfo.HasCombustionEngine && !DataBus.EngineInfo.EngineOn && first is ResponseOverload) { first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient); debug.Add(new { action = "Coast:(Overload & ICE off) -> Accelerate", first }); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs index 7645f3f5752121a6b3201cc67f29f030768ad2ca..dd7b499ad2d439ffda2ac7c012e5ac969cda52c6 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs @@ -20,6 +20,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected IElectricSystem ElectricPower; protected IElectricMotorControl Control; protected ElectricMotorData ModelData; + private PerSecond _maxSpeed; public ElectricMotor(IVehicleContainer container, ElectricMotorData data, IElectricMotorControl control, PowertrainPosition position) : base(container) { @@ -30,8 +31,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } public PowertrainPosition Position { get; } + public PerSecond MaxSpeed + { + get { return _maxSpeed ?? (_maxSpeed = ModelData.FullLoadCurve.FullLoadEntries.MaxBy(x => x.MotorSpeed).MotorSpeed); } + } + + public Watt DragPower(PerSecond electricMotorSpeed) + { + return ModelData.DragCurve.Lookup(electricMotorSpeed) * electricMotorSpeed; + } - public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity) + public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity) { PreviousState.OutAngularVelocity = outAngularVelocity; PreviousState.OutTorque = outTorque; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs index ec468055d9f2041c6fa22100233642c0a98c96ca..c49fbb05b5ecd800ce8509074711970ab66b272c 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs @@ -32,6 +32,7 @@ using System; using System.Linq; using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; @@ -62,12 +63,41 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl AirdragData.CrossWindCorrectionCurve.SetDataBus(container); } var model = container.RunData; - if (model?.GearboxData == null || model.AxleGearData == null) { - return; + + if (container.PowertrainInfo.HasCombustionEngine) { + if (model?.GearboxData == null || model.AxleGearData == null) { + return; + } + MaxVehicleSpeed = model.EngineData.FullLoadCurves[0].N95hSpeed / + model.GearboxData.Gears[model.GearboxData.Gears.Keys.Max()].Ratio / + model.AxleGearData.AxleGear.Ratio / + (model.AngledriveData?.Angledrive.Ratio + ?? 1.0) * model.VehicleData.DynamicTyreRadius * 0.995; + } + + if (model.ElectricMachinesData != null && model.ElectricMachinesData.Count > 0) { + var positions = model.ElectricMachinesData.Select(x => x.Item1).ToArray(); + if (positions.Length > 1) { + throw new VectoException("Multiple electrical machines are currently not supported"); + } + + var pos = positions.First(); + if (pos.IsBatteryElectric()) { + var maxEMSpeed = model.ElectricMachinesData.Find(x => x.Item1 == pos).Item2.FullLoadCurve + .FullLoadEntries.Max(x => x.MotorSpeed); // DataBus.ElectricMotorInfo(pos).MaxSpeed; + var ratio = 1.0; + if (pos == PowertrainPosition.BatteryElectricB3) { + ratio = model.AxleGearData.AxleGear.Ratio; + } + + if (pos == PowertrainPosition.BatteryElectricB2) { + ratio = model.GearboxData.Gears[model.GearboxData.Gears.Keys.Max()].Ratio * + model.AxleGearData.AxleGear.Ratio * + (model.AngledriveData?.Angledrive.Ratio ?? 1.0); + } + MaxVehicleSpeed = maxEMSpeed / ratio * model.VehicleData.DynamicTyreRadius * 0.995; + } } - MaxVehicleSpeed = model.EngineData.FullLoadCurves[0].N95hSpeed / - model.GearboxData.Gears[model.GearboxData.Gears.Keys.Max()].Ratio / model.AxleGearData.AxleGear.Ratio / - (model.AngledriveData?.Angledrive.Ratio ?? 1.0) * model.VehicleData.DynamicTyreRadius * 0.995; } diff --git a/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs index 8f88fdd002b531c1e8d835f9a214005898a81d34..4a1811d3caf35f3439573837349505651e2798d6 100644 --- a/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs +++ b/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs @@ -61,7 +61,7 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual("401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.DrivingTorque]); Assert.AreEqual("-401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.GenerationTorque]); - var fldMap = ElectricFullLoadCurveReader.Create(fld); + var fldMap = ElectricFullLoadCurveReader.Create(fld, 1, 1, 1); Assert.AreEqual(-401.07, fldMap.FullLoadDriveTorque(0.RPMtoRad()).Value()); Assert.AreEqual(401.07, fldMap.FullGenerationTorque(0.RPMtoRad()).Value()); @@ -70,12 +70,46 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual("-800", pwr.Rows[0][ElectricMotorMapReader.Fields.Torque]); Assert.AreEqual("9.8449", pwr.Rows[0][ElectricMotorMapReader.Fields.PowerElectrical]); - var pwrMap = ElectricMotorMapReader.Create(pwr); + var pwrMap = ElectricMotorMapReader.Create(pwr, 1, 1, 1); Assert.AreEqual(-10171.0, pwrMap.LookupElectricPower(-0.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value()); - } + Assert.AreEqual(-20430.186, pwrMap.LookupElectricPower(120.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3); - [TestCase()] + } + + [TestCase()] + public void TestReadElectricMotorAggregation() + { + var inputProvider = + JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false); + + Assert.AreEqual(0.15, inputProvider.Inertia.Value(), 1e-6); + + var fld = inputProvider.FullLoadCurve; + Assert.AreEqual("0", fld.Rows[0][ElectricFullLoadCurveReader.Fields.MotorSpeed]); + Assert.AreEqual("401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.DrivingTorque]); + Assert.AreEqual("-401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.GenerationTorque]); + + var fldMap = ElectricFullLoadCurveReader.Create(fld, 22.6, 2, 0.97); + Assert.AreEqual(-17584.51308 , fldMap.FullLoadDriveTorque(0.RPMtoRad()).Value(), 1e-3); + Assert.AreEqual(18689.03505, fldMap.FullGenerationTorque(0.RPMtoRad()).Value(), 1e-3); + + Assert.AreEqual(-17584.51308, fldMap.FullLoadDriveTorque(50.RPMtoRad()).Value(), 1e-3); + Assert.AreEqual(18689.03505, fldMap.FullGenerationTorque(50.RPMtoRad()).Value(), 1e-3); + + var pwr = inputProvider.EfficiencyMap; + Assert.AreEqual("0", pwr.Rows[0][ElectricMotorMapReader.Fields.MotorSpeed]); + Assert.AreEqual("-800", pwr.Rows[0][ElectricMotorMapReader.Fields.Torque]); + Assert.AreEqual("9.8449", pwr.Rows[0][ElectricMotorMapReader.Fields.PowerElectrical]); + + var pwrMap = ElectricMotorMapReader.Create(pwr, 22.6, 2, 0.97); + Assert.AreEqual(-146.469, pwrMap.LookupElectricPower(-0.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3); + + Assert.AreEqual(-20773.997, pwrMap.LookupElectricPower(120.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3); + + } + + [TestCase()] public void TestReadHybridVehicle() { var inputProvider = JSONInputDataFactory.ReadJsonJob(@"TestData\Hybrids\GenericVehicle_Group2_P2\Class2_RigidTruck_ParHyb_ENG.vecto"); diff --git a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs index 8265e7b93c61b6c31499f3162a2ee50abbd7dbea..fa9f3f26b725c207d2ad632a427d7c5597692b75 100644 --- a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs +++ b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs @@ -8,6 +8,7 @@ using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Impl; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.Declaration; @@ -35,11 +36,11 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric private ModalResultField[] Yfields; - public const string MotorFile = @"TestData\Hybrids\ElectricMotor\GenericEMotor.vem"; - public const string BatFile = @"TestData\Hybrids\Battery\GenericBattery.vbat"; + public const string MotorFile = @"TestData\BatteryElectric\GenericVehicleB4\GenericEMotor_125kW_485Nm.vem"; + public const string BatFile = @"TestData\BatteryElectric\GenericVehicleB4\GenericBattery_243kWh_750V.vbat"; public const string AccelerationFile = @"TestData\Components\Truck.vacc"; - public const string MotorFile240kW = @"TestData\Hybrids\ElectricMotor\GenericEMotor240kW.vem"; + //public const string MotorFile240kW = @"TestData\Hybrids\ElectricMotor\GenericEMotor240kW.vem"; public const string GearboxIndirectLoss = @"TestData\Components\Indirect Gear.vtlm"; public const string GearboxDirectLoss = @"TestData\Components\Direct Gear.vtlm"; @@ -75,23 +76,23 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric [ TestCase(30, 0.7, 0, 0, TestName = "B4 BEV ConstantSpeed 30km/h SoC: 0.7, level"), TestCase(50, 0.7, 0, 0, TestName = "B4 BEV ConstantSpeed 50km/h SoC: 0.7, level"), - TestCase(80, 0.7, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.7, level"), + //TestCase(80, 0.7, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.7, level"), TestCase(30, 0.25, 0, 0, TestName = "B4 BEV ConstantSpeed 30km/h SoC: 0.25, level"), TestCase(50, 0.25, 0, 0, TestName = "B4 BEV ConstantSpeed 50km/h SoC: 0.25, level"), - TestCase(80, 0.25, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.25, level"), + //TestCase(80, 0.25, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.25, level"), TestCase(30, 0.5, 5, 0, TestName = "B4 BEV ConstantSpeed 30km/h SoC: 0.5, UH 5%"), TestCase(50, 0.5, 5, 0, TestName = "B4 BEV ConstantSpeed 50km/h SoC: 0.5, UH 5%"), - TestCase(80, 0.5, 5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, UH 5%"), + //TestCase(80, 0.5, 5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, UH 5%"), TestCase(30, 0.5, -5, 0, TestName = "B4 BEV ConstantSpeed 30km/h SoC: 0.5, DH 5%"), TestCase(50, 0.5, -5, 0, TestName = "B4 BEV ConstantSpeed 50km/h SoC: 0.5, DH 5%"), - TestCase(80, 0.5, -5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, DH 5%"), + //TestCase(80, 0.5, -5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, DH 5%"), TestCase(30, 0.25, 0, 1000, TestName = "B4 BEV ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 1kW"), TestCase(30, 0.25, 0, 5000, TestName = "B4 BEV ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 5kW"), - ] + ] // the vehicle can drive max. 56km/h!! 80km/h testcase makes no sense public void B4BEVConstantSpeed(double vmax, double initialSoC, double slope, double pAuxEl) { GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B4 }).ToArray(); @@ -106,7 +107,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var modFilename = string.Format("SimpleBatteryElectric-B4_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl); + cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; @@ -141,7 +142,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var modFilename = string.Format("SimpleBatteryElectric-B4_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true); + cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; @@ -152,20 +153,185 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric GraphWriter.Write(modFilename); } - // ================================================= + [ + TestCase("LongHaul", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle LongHaul, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("RegionalDelivery", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle RegionalDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("UrbanDelivery", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle UrbanDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Construction", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Construction, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Urban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Urban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Suburban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle SubUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Interurban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle InterUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Coach", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Coach, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + ] + public void B4BEVDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl) + { + GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B4 }).ToArray(); + + var cycleData = RessourceHelper.ReadStream( + DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + + declarationMission + + Constants.FileExtensions.CycleFile); + var cycle = DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased, "", false); + + const bool largeMotor = true; + + var modFilename = string.Format("SimpleParallelHybrid-B4_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); + const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; + var run = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + var data = run.GetContainer().RunData; + //File.WriteAllText( + // $"{modFilename}.json", + // JsonConvert.SerializeObject(data, Formatting.Indented)); + + run.Run(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + GraphWriter.Write(modFilename); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + [ + TestCase(30, 0.7, 0, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.7, level"), + TestCase(50, 0.7, 0, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.7, level"), + //TestCase(80, 0.7, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.7, level"), + + TestCase(30, 0.25, 0, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level"), + TestCase(50, 0.25, 0, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.25, level"), + //TestCase(80, 0.25, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.25, level"), + + TestCase(30, 0.5, 5, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.5, UH 5%"), + TestCase(50, 0.5, 5, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.5, UH 5%"), + //TestCase(80, 0.5, 5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, UH 5%"), + + TestCase(30, 0.5, -5, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.5, DH 5%"), + TestCase(50, 0.5, -5, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.5, DH 5%"), + //TestCase(80, 0.5, -5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, DH 5%"), + + TestCase(30, 0.25, 0, 1000, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 1kW"), + TestCase(30, 0.25, 0, 5000, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 5kW"), + ] // the vehicle can drive max. 56km/h!! 80km/h testcase makes no sense + public void B3BEVConstantSpeed(double vmax, double initialSoC, double slope, double pAuxEl) + { + GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B3 }).ToArray(); + + var cycleData = string.Format( + @" 0, {0}, {1}, 0 + 7000, {0}, {1}, 0", vmax, slope); + var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); + + const bool largeMotor = true; + + var modFilename = string.Format("SimpleBatteryElectric-B3_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); + const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; + var run = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + var data = run.GetContainer().RunData; + //File.WriteAllText( + // $"{modFilename}.json", + // JsonConvert.SerializeObject(data, Formatting.Indented)); + + run.Run(); + Assert.IsTrue(run.FinishedWithoutErrors); + Assert.IsTrue(modData.Rows.Count > 0); + GraphWriter.Write(modFilename); + } - public static VectoRun CreateEngineeringRun( - DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, bool largeMotor = false, + + [ + TestCase(30, 0.7, 0, TestName = "B3 BEV DriveOff 30km/h SoC: 0.7, level"), + TestCase(80, 0.7, 0, TestName = "B3 BEV DriveOff 80km/h SoC: 0.7, level"), + TestCase(30, 0.25, 0, TestName = "B3 BEV DriveOff 30km/h SoC: 0.25, level") + ] + public void B3BEVDriveOff(double vmax, double initialSoC, double slope) + { + GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B3 }).ToArray(); + var cycleData = string.Format( + @" 0, 0, {1}, 3 + 700, {0}, {1}, 0", vmax, slope); + var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); + + const bool largeMotor = true; + + var modFilename = string.Format("SimpleBatteryElectric-B3_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); + const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; + var run = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + run.Run(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + GraphWriter.Write(modFilename); + } + + [ + TestCase("LongHaul", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle LongHaul, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("RegionalDelivery", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle RegionalDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("UrbanDelivery", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle UrbanDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Construction", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Construction, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Urban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Urban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Suburban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle SubUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Interurban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle InterUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + TestCase("Coach", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Coach, SoC: 0.8 Payload: 2t P_auxEl: 0kW"), + ] + public void B3BEVDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl) + { + GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B3 }).ToArray(); + + var cycleData = RessourceHelper.ReadStream( + DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + + declarationMission + + Constants.FileExtensions.CycleFile); + var cycle = DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased, "", false); + + const bool largeMotor = true; + + var modFilename = string.Format("SimpleParallelHybrid-B3_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); + const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; + var run = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + var data = run.GetContainer().RunData; + //File.WriteAllText( + // $"{modFilename}.json", + // JsonConvert.SerializeObject(data, Formatting.Indented)); + + run.Run(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + GraphWriter.Write(modFilename); + } + + + // ================================================= + + + public static VectoRun CreateEngineeringRun( + DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, int count, double ratio, bool largeMotor = false, SummaryDataContainer sumData = null, double pAuxEl = 0, Kilogram payload = null) { var container = CreateBatteryElectricPowerTrain( - cycleData, Path.GetFileNameWithoutExtension(modFileName), initialSoc, largeMotor, sumData, pAuxEl, pos, payload); + cycleData, Path.GetFileNameWithoutExtension(modFileName), initialSoc, count, ratio, largeMotor, sumData, pAuxEl, pos, payload); return new DistanceRun(container); } public static VehicleContainer CreateBatteryElectricPowerTrain(DrivingCycleData cycleData, string modFileName, - double initialBatCharge, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, PowertrainPosition pos, Kilogram payload = null) + double initialBatCharge, int count, double ratio, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, PowertrainPosition pos, Kilogram payload = null) { var fileWriter = new FileOutputWriter(modFileName); var modDataFilter = new IModalDataFilter[] { }; //new IModalDataFilter[] { new ActualModalDataFilter(), }; @@ -184,7 +350,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var driverData = CreateDriverData(AccelerationFile, true); var electricMotorData = - MockSimulationDataFactory.CreateElectricMotorData(largeMotor ? MotorFile240kW : MotorFile, pos); + MockSimulationDataFactory.CreateElectricMotorData(MotorFile, count, pos, ratio / (pos == PowertrainPosition.BatteryElectricB3 ? 2.59 : 1.0), 0.97); var batteryData = MockSimulationDataFactory.CreateBatteryData(BatFile, initialBatCharge); @@ -200,8 +366,8 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var runData = new VectoRunData() { JobRunId = 0, DriverData = driverData, - AxleGearData = axleGearData, - GearboxData = gearboxData, + //AxleGearData = axleGearData, + //GearboxData = gearboxData, VehicleData = vehicleData, AirdragData = airdragData, JobName = modFileName, @@ -209,11 +375,19 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric Retarder = new RetarderData() { Type = RetarderType.None }, Aux = new List<VectoRunData.AuxData>(), ElectricMachinesData = electricMotorData, - EngineData = engineData, + //EngineData = engineData, BatteryData = batteryData, GearshiftParameters = CreateGearshiftData(gearboxData, axleGearData.AxleGear.Ratio, engineData.IdleSpeed), ElectricAuxDemand = pAuxEl.SI<Watt>() }; + if (pos == PowertrainPosition.BatteryElectricB3) { + runData.AxleGearData = axleGearData; + } + + if (pos == PowertrainPosition.BatteryElectricB2) { + runData.AxleGearData = axleGearData; + runData.GearboxData = gearboxData; + } var container = new VehicleContainer( ExecutionMode.Engineering, modData, x => { sumData?.Write(x, 1, 1, runData); }); container.RunData = runData; @@ -251,14 +425,18 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric case PowertrainPosition.BatteryElectricB4: powertrain.AddComponent( GetElectricMachine(PowertrainPosition.BatteryElectricB4, runData.ElectricMachinesData, container, es, ctl)); - new MockGearboxInfo(container); - new ATClutchInfo(container); - break; + new MockGearboxInfo(container); + //new MockEngineInfo(container); + new ATClutchInfo(container); + break; case PowertrainPosition.BatteryElectricB3: powertrain.AddComponent(new AxleGear(container, runData.AxleGearData)) .AddComponent( GetElectricMachine(PowertrainPosition.BatteryElectricB3, runData.ElectricMachinesData, container, es, ctl)); - break; + new MockGearboxInfo(container); + //new MockEngineInfo(container); + new ATClutchInfo(container); + break; case PowertrainPosition.BatteryElectricB2: throw new VectoException("Battery Electric configuration B2 currently not supported"); default: throw new ArgumentOutOfRangeException(nameof(pos), pos, null); @@ -341,14 +519,15 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric TyreTestLoad = 30436.SI<Newton>() }, }; + var wheels = DeclarationData.Wheels.Lookup("275/70 R22.5"); return new VehicleData { AirDensity = DeclarationData.AirDensity, AxleConfiguration = AxleConfiguration.AxleConfig_4x2, CurbMass = 11500.SI<Kilogram>(), Loading = loading, - DynamicTyreRadius = 0.465.SI<Meter>(), + DynamicTyreRadius = wheels.DynamicTyreRadius, AxleData = axles, - SavedInDeclarationMode = false + SavedInDeclarationMode = false, }; } @@ -384,7 +563,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric EngineOffStandStillActivationDelay = DeclarationData.Driver.EngineStopStart.ActivationDelay, MaxEngineOffTimespan = DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan, UtilityFactor = DeclarationData.Driver.EngineStopStart.UtilityFactor - } + }, }; } @@ -432,6 +611,56 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric } } + public class MockEngineInfo : VectoSimulationComponent, IEngineInfo + { + public MockEngineInfo(VehicleContainer container) : base(container) + { + } + + protected override void DoWriteModalResults(Second time, Second simulationInterval, IModalDataContainer container) + { } + + protected override void DoCommitSimulationStep(Second time, Second simulationInterval) + { } + + public PerSecond EngineSpeed + { + get { return null; } + } + public NewtonMeter EngineTorque + { + get { return null; } + } + public Watt EngineStationaryFullPower(PerSecond angularSpeed) + { + throw new NotImplementedException(); + } + + public Watt EngineDynamicFullLoadPower(PerSecond avgEngineSpeed, Second dt) + { + throw new NotImplementedException(); + } + + public Watt EngineDragPower(PerSecond angularSpeed) + { + throw new NotImplementedException(); + } + + public Watt EngineAuxDemand(PerSecond avgEngineSpeed, Second dt) + { + throw new NotImplementedException(); + } + + public PerSecond EngineIdleSpeed { get; } + public PerSecond EngineRatedSpeed { get; } + public PerSecond EngineN95hSpeed { get; } + public PerSecond EngineN80hSpeed { get; } + public bool EngineOn + { + get { return true; } + } + } + public class MockGearboxInfo : VectoSimulationComponent, IGearboxInfo { public MockGearboxInfo(VehicleContainer container) : base(container) diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs index f70636bc6b10ef92835eaaa6e68c77802539b51f..07a35a262f31e55432f84e2efd197928bd7b2044 100644 --- a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs @@ -88,7 +88,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P2_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP2; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -136,7 +136,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P2_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP2; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -180,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P2_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP2; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>()); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>()); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -248,7 +248,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P2_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP2; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -301,7 +301,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P3_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP3; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -339,7 +339,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P3_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP3; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -372,7 +372,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P3_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP3; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -414,7 +414,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P3_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP3; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>()); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>()); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -469,7 +469,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P4_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP4; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -507,7 +507,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P4_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP4; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -540,7 +540,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P4_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP4; var run = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, largeMotor: true); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -558,11 +558,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid // ================================================= - public static VectoRun CreateEngineeringRun(DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, bool largeMotor = false, + public static VectoRun CreateEngineeringRun(DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, double ratio, bool largeMotor = false, SummaryDataContainer sumData = null, double pAuxEl = 0, Kilogram payload = null) { var container = CreateParallelHybridPowerTrain( - cycleData, Path.GetFileNameWithoutExtension(modFileName), initialSoc, largeMotor, sumData, pAuxEl, pos, payload); + cycleData, Path.GetFileNameWithoutExtension(modFileName), initialSoc, largeMotor, sumData, pAuxEl, pos, ratio, payload); return new DistanceRun(container); } @@ -575,8 +575,8 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid } public static VehicleContainer CreateParallelHybridPowerTrain(DrivingCycleData cycleData, string modFileName, - double initialBatCharge, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, PowertrainPosition pos, Kilogram payload = null) - { + double initialBatCharge, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, PowertrainPosition pos, double ratio, Kilogram payload = null) + { var fileWriter = new FileOutputWriter(modFileName); var modDataFilter = new IModalDataFilter[] { }; //new IModalDataFilter[] { new ActualModalDataFilter(), }; var modData = new ModalDataContainer( @@ -593,7 +593,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var driverData = CreateDriverData(AccelerationFile, true); var electricMotorData = - MockSimulationDataFactory.CreateElectricMotorData(largeMotor ? MotorFile240kW : MotorFile, pos); + MockSimulationDataFactory.CreateElectricMotorData(largeMotor ? MotorFile240kW : MotorFile, 1, pos, ratio, 1); var batteryData = MockSimulationDataFactory.CreateBatteryData(BatFile, initialBatCharge); //batteryData.TargetSoC = 0.5; diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ElectricMotorEfficienyMapTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ElectricMotorEfficienyMapTest.cs index bb7f288fd027470eedde15ff0e4a5f30a044ee00..d23702ed4098e5c15c25d1fa3a25998730687128 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ElectricMotorEfficienyMapTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ElectricMotorEfficienyMapTest.cs @@ -26,10 +26,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData { JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false); var fld = inputProvider.FullLoadCurve; - var fldMap = ElectricFullLoadCurveReader.Create(fld); + var fldMap = ElectricFullLoadCurveReader.Create(fld, 1.0, 1, 1.0); var pwr = inputProvider.EfficiencyMap; - var pwrMap = ElectricMotorMapReader.Create(pwr); + var pwrMap = ElectricMotorMapReader.Create(pwr, 1.0, 1, 1.0); var maxEmPwr = batPwr < 0 ? fldMap.FullLoadDriveTorque(emSpeed.RPMtoRad()) @@ -51,10 +51,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData { JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false); var fld = inputProvider.FullLoadCurve; - var fldMap = ElectricFullLoadCurveReader.Create(fld); + var fldMap = ElectricFullLoadCurveReader.Create(fld, 1.0, 1, 1.0); var pwr = inputProvider.EfficiencyMap; - var pwrMap = ElectricMotorMapReader.Create(pwr); + var pwrMap = ElectricMotorMapReader.Create(pwr, 1.0, 1, 1.0); var maxEmPwr = batPwr < 0 ? fldMap.FullLoadDriveTorque(emSpeed.RPMtoRad()) diff --git a/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericBattery_243kWh_750V.vbat b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericBattery_243kWh_750V.vbat new file mode 100644 index 0000000000000000000000000000000000000000..fd92ed38b9995cd744e3576622e07a7f545b2c3f --- /dev/null +++ b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericBattery_243kWh_750V.vbat @@ -0,0 +1,30 @@ +{ + "Header": { + "CreatedBy": " ()", + "Date": "2016-10-13T08:54:28.7387223Z", + "AppVersion": "3", + "FileVersion": 1 + }, + "Body": { + "SavedInDeclMode": false, + "Model": "Generic Battery", + "InternalResistance": 0.04, + "SOC_min": 10, + "SOC_max": 90, + "MaxCurrentFactor": 5, + "Capacity": 324, + "SOC": [ + [ 0, 673.5 ], + [ 10, 700.2 ], + [ 20, 715.4 ], + [ 30, 723.6 ], + [ 40, 727.7 ], + [ 50, 730.0 ], + [ 60, 731.6 ], + [ 70, 733.8 ], + [ 80, 737.1 ], + [ 90, 742.2 ], + [ 100, 750.2 ] + ] + } +} \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericDrag_125kW_485Nm.vemd b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericDrag_125kW_485Nm.vemd new file mode 100644 index 0000000000000000000000000000000000000000..5345f4d143e5bbbd10d7b60fc2162be685b23c63 --- /dev/null +++ b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericDrag_125kW_485Nm.vemd @@ -0,0 +1,3 @@ +n [rpm] , T_drag [Nm] +0 , 6.06 +7363.77 , 30.31 \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericEMotor_125kW_485Nm.vem b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericEMotor_125kW_485Nm.vem new file mode 100644 index 0000000000000000000000000000000000000000..c0a57a974a3014e456ffe5cb2d4c6f1ed3b056b4 --- /dev/null +++ b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericEMotor_125kW_485Nm.vem @@ -0,0 +1,17 @@ +{ + "Header": { + "CreatedBy": " ()", + "Date": "2016-10-13T08:54:28.7387223Z", + "AppVersion": "3", + "FileVersion": 1 + }, + "Body": { + "SavedInDeclMode": false, + "Model": "Generic Electric Motor", + "FullLoadCurve": "GenericEMotor_125kW_485Nm.vemp", + "DragCurve": "GenericDrag_125kW_485Nm.vemd", + "EfficiencyMap": "GenericMap_125kW_485Nm.vemo", + "Inertia" : 0.225 + + } +} \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericEMotor_125kW_485Nm.vemp b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericEMotor_125kW_485Nm.vemp new file mode 100644 index 0000000000000000000000000000000000000000..2d3d1f8b593e45e85fad7451eae2657610ef3dbe --- /dev/null +++ b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericEMotor_125kW_485Nm.vemp @@ -0,0 +1,74 @@ +n [rpm] , T_drive [Nm] , T_drag [Nm] +0,485,-485 +2461.158914,485,-485 +2452.135493,485,-485 +2466.863034,483.8845,-483.8845 +2481.590574,481.010875,-481.010875 +2496.318115,478.173625,-478.173625 +2503.681885,476.767125,-476.767125 +2577.319588,463.138625,-463.138625 +2650.95729,450.274,-450.274 +2724.594993,438.1005,-438.1005 +2798.232695,426.58175,-426.58175 +2871.870398,415.645,-415.645 +2945.5081,405.253875,-405.253875 +3019.145803,395.359875,-395.359875 +3092.783505,385.950875,-385.950875 +3166.421208,376.978375,-376.978375 +3240.05891,368.406,-368.406 +3313.696613,360.221625,-360.221625 +3387.334315,352.388875,-352.388875 +3460.972018,344.895625,-344.895625 +3534.60972,337.7055,-337.7055 +3608.247423,330.8185,-330.8185 +3681.885125,324.19825,-324.19825 +3755.522828,317.84475,-317.84475 +3829.16053,311.73375,-311.73375 +3902.798233,305.853125,-305.853125 +3976.435935,300.178625,-300.178625 +4050.073638,294.722375,-294.722375 +4123.71134,289.460125,-289.460125 +4197.349043,284.37975,-284.37975 +4270.986745,279.48125,-279.48125 +4344.624448,274.740375,-274.740375 +4418.26215,270.16925,-270.16925 +4491.899853,265.7315,-265.7315 +4565.537555,261.451375,-261.451375 +4639.175258,257.304625,-257.304625 +4712.81296,253.279125,-253.279125 +4786.450663,249.387,-249.387 +4860.088365,245.604,-245.604 +4933.726068,241.94225,-241.94225 +5007.36377,238.3775,-238.3775 +5081.001473,234.921875,-234.921875 +5154.639175,231.575375,-231.575375 +5228.276878,228.31375,-228.31375 +5301.91458,225.137,-225.137 +5375.552283,222.05725,-222.05725 +5449.189985,219.05025,-219.05025 +5522.827688,216.128125,-216.128125 +5596.46539,213.290875,-213.290875 +5670.103093,210.51425,-210.51425 +5743.740795,207.8225,-207.8225 +5817.378498,205.191375,-205.191375 +5891.0162,202.620875,-202.620875 +5964.653903,200.123125,-200.123125 +6038.291605,197.686,-197.686 +6111.929308,195.297375,-195.297375 +6185.56701,192.969375,-192.969375 +6259.204713,190.702,-190.702 +6332.842415,188.483125,-188.483125 +6406.480118,186.324875,-186.324875 +6480.11782,184.203,-184.203 +6553.755523,182.129625,-182.129625 +6627.393225,180.10475,-180.10475 +6701.030928,178.128375,-178.128375 +6774.66863,176.2005,-176.2005 +6848.306333,174.296875,-174.296875 +6921.944035,172.44175,-172.44175 +6995.581738,170.635125,-170.635125 +7069.21944,168.85275,-168.85275 +7142.857143,167.10675,-167.10675 +7216.494845,165.40925,-165.40925 +7290.132548,163.736,-163.736 +7363.77025,162.099125,-162.099125 diff --git a/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericMap_125kW_485Nm.vemo b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericMap_125kW_485Nm.vemo new file mode 100644 index 0000000000000000000000000000000000000000..972a8b6ac4dea65a1eec263ec1c6189009f29910 --- /dev/null +++ b/VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericMap_125kW_485Nm.vemo @@ -0,0 +1,2016 @@ +n [rpm] , T [Nm] , P_el [kW] +0,-485,8.790089286 +0,-469.84375,8.278482143 +0,-454.6875,7.782232143 +0,-439.53125,7.301160714 +0,-424.375,6.835535714 +0,-409.21875,6.385178571 +0,-394.0625,5.950089286 +0,-378.90625,5.530357143 +0,-363.75,5.125892857 +0,-348.59375,4.736785714 +0,-333.4375,4.363035714 +0,-318.28125,4.004553571 +0,-303.125,3.661339286 +0,-287.96875,3.333482143 +0,-272.8125,3.020892857 +0,-257.65625,2.723660714 +0,-242.5,2.441785714 +0,-227.34375,2.175178571 +0,-212.1875,1.923839286 +0,-197.03125,1.687857143 +0,-181.875,1.467232143 +0,-166.71875,1.261875 +0,-151.5625,1.071785714 +0,-136.40625,0.897053571 +0,-121.25,0.737651786 +0,-106.09375,0.593553571 +0,-90.9375,0.464758929 +0,-75.78125,0.351285714 +0,-60.625,0.253116071 +0,-45.46875,0.170267857 +0,-30.3125,0.102732143 +0,-15.15625,0.050505357 +0,0,0.032232143 +0,15.15625,0.077659821 +0,30.3125,0.138401786 +0,45.46875,0.214455357 +0,60.625,0.305821429 +0,75.78125,0.4125 +0,90.9375,0.5345 +0,106.09375,0.671803571 +0,121.25,0.824419643 +0,136.40625,0.992321429 +0,151.5625,1.175625 +0,166.71875,1.374196429 +0,181.875,1.588035714 +0,197.03125,1.817232143 +0,212.1875,2.061696429 +0,227.34375,2.321517857 +0,242.5,2.596696429 +0,257.65625,2.887142857 +0,272.8125,3.192857143 +0,287.96875,3.513928571 +0,303.125,3.850267857 +0,318.28125,4.201964286 +0,333.4375,4.569017857 +0,348.59375,4.951339286 +0,363.75,5.348928571 +0,378.90625,5.761875 +0,394.0625,6.190178571 +0,409.21875,6.63375 +0,424.375,7.092589286 +0,439.53125,7.566785714 +0,454.6875,8.056339286 +0,469.84375,8.561160714 +0,485,9.08125 +70.31811487,-485,5.211339286 +70.31811487,-469.84375,4.812589286 +70.31811487,-454.6875,4.429107143 +70.31811487,-439.53125,4.060892857 +70.31811487,-424.375,3.708035714 +70.31811487,-409.21875,3.370535714 +70.31811487,-394.0625,3.048303571 +70.31811487,-378.90625,2.741428571 +70.31811487,-363.75,2.449821429 +70.31811487,-348.59375,2.173571429 +70.31811487,-333.4375,1.912589286 +70.31811487,-318.28125,1.666875 +70.31811487,-303.125,1.436607143 +70.31811487,-287.96875,1.221517857 +70.31811487,-272.8125,1.021875 +70.31811487,-257.65625,0.8374375 +70.31811487,-242.5,0.668348214 +70.31811487,-227.34375,0.5154375 +70.31811487,-212.1875,0.378214286 +70.31811487,-197.03125,0.256839286 +70.31811487,-181.875,0.150473214 +70.31811487,-166.71875,0.059122321 +70.31811487,-151.5625,-0.017219643 +70.31811487,-136.40625,-0.078552679 +70.31811487,-121.25,-0.124875 +70.31811487,-106.09375,-0.1561875 +70.31811487,-90.9375,-0.172491071 +70.31811487,-75.78125,-0.173785714 +70.31811487,-60.625,-0.1600625 +70.31811487,-45.46875,-0.131339286 +70.31811487,-30.3125,-0.087598214 +70.31811487,-15.15625,-0.028850893 +70.31811487,0,0.0646875 +70.31811487,15.15625,0.222955357 +70.31811487,30.3125,0.396526786 +70.31811487,45.46875,0.585419643 +70.31811487,60.625,0.789616071 +70.31811487,75.78125,1.009107143 +70.31811487,90.9375,1.243928571 +70.31811487,106.09375,1.494107143 +70.31811487,121.25,1.759553571 +70.31811487,136.40625,2.040357143 +70.31811487,151.5625,2.336428571 +70.31811487,166.71875,2.647767857 +70.31811487,181.875,2.974553571 +70.31811487,197.03125,3.316517857 +70.31811487,212.1875,3.673839286 +70.31811487,227.34375,4.046517857 +70.31811487,242.5,4.434464286 +70.31811487,257.65625,4.837767857 +70.31811487,272.8125,5.256339286 +70.31811487,287.96875,5.690267857 +70.31811487,303.125,6.139464286 +70.31811487,318.28125,6.604017857 +70.31811487,333.4375,7.083839286 +70.31811487,348.59375,7.579017857 +70.31811487,363.75,8.089464286 +70.31811487,378.90625,8.615267857 +70.31811487,394.0625,9.15625 +70.31811487,409.21875,9.7125 +70.31811487,424.375,10.28482143 +70.31811487,439.53125,10.87142857 +70.31811487,454.6875,11.47410714 +70.31811487,469.84375,12.09107143 +70.31811487,485,12.72410714 +140.6377025,-485,1.634196429 +140.6377025,-469.84375,1.348303571 +140.6377025,-454.6875,1.078125 +140.6377025,-439.53125,0.825508929 +140.6377025,-424.375,0.589589286 +140.6377025,-409.21875,0.368678571 +140.6377025,-394.0625,0.162776786 +140.6377025,-378.90625,-0.02811875 +140.6377025,-363.75,-0.204 +140.6377025,-348.59375,-0.364875 +140.6377025,-333.4375,-0.510732143 +140.6377025,-318.28125,-0.641589286 +140.6377025,-303.125,-0.757428571 +140.6377025,-287.96875,-0.858258929 +140.6377025,-272.8125,-0.944107143 +140.6377025,-257.65625,-1.014910714 +140.6377025,-242.5,-1.070714286 +140.6377025,-227.34375,-1.111517857 +140.6377025,-212.1875,-1.137232143 +140.6377025,-197.03125,-1.148035714 +140.6377025,-181.875,-1.143839286 +140.6377025,-166.71875,-1.124553571 +140.6377025,-151.5625,-1.090267857 +140.6377025,-136.40625,-1.040982143 +140.6377025,-121.25,-0.976696429 +140.6377025,-106.09375,-0.897410714 +140.6377025,-90.9375,-0.803151786 +140.6377025,-75.78125,-0.693839286 +140.6377025,-60.625,-0.569526786 +140.6377025,-45.46875,-0.430196429 +140.6377025,-30.3125,-0.275857143 +140.6377025,-15.15625,-0.106508929 +140.6377025,0,0.098794643 +140.6377025,15.15625,0.369892857 +140.6377025,30.3125,0.6563125 +140.6377025,45.46875,0.958035714 +140.6377025,60.625,1.275089286 +140.6377025,75.78125,1.607410714 +140.6377025,90.9375,1.955089286 +140.6377025,106.09375,2.318035714 +140.6377025,121.25,2.696339286 +140.6377025,136.40625,3.09 +140.6377025,151.5625,3.498928571 +140.6377025,166.71875,3.923125 +140.6377025,181.875,4.362678571 +140.6377025,197.03125,4.8175 +140.6377025,212.1875,5.287678571 +140.6377025,227.34375,5.773214286 +140.6377025,242.5,6.274017857 +140.6377025,257.65625,6.790089286 +140.6377025,272.8125,7.321517857 +140.6377025,287.96875,7.868214286 +140.6377025,303.125,8.430267857 +140.6377025,318.28125,9.008035714 +140.6377025,333.4375,9.6 +140.6377025,348.59375,10.20803571 +140.6377025,363.75,10.83125 +140.6377025,378.90625,11.47053571 +140.6377025,394.0625,12.12410714 +140.6377025,409.21875,12.79375 +140.6377025,424.375,13.47767857 +140.6377025,439.53125,14.17767857 +140.6377025,454.6875,14.89285714 +140.6377025,469.84375,15.62321429 +140.6377025,485,16.36964286 +210.9572901,-485,-1.881339286 +210.9572901,-469.84375,-2.051696429 +210.9572901,-454.6875,-2.207053571 +210.9572901,-439.53125,-2.347321429 +210.9572901,-424.375,-2.472678571 +210.9572901,-409.21875,-2.582946429 +210.9572901,-394.0625,-2.678303571 +210.9572901,-378.90625,-2.758571429 +210.9572901,-363.75,-2.823839286 +210.9572901,-348.59375,-2.874107143 +210.9572901,-333.4375,-2.909375 +210.9572901,-318.28125,-2.929642857 +210.9572901,-303.125,-2.934910714 +210.9572901,-287.96875,-2.925089286 +210.9572901,-272.8125,-2.900357143 +210.9572901,-257.65625,-2.860535714 +210.9572901,-242.5,-2.805714286 +210.9572901,-227.34375,-2.735892857 +210.9572901,-212.1875,-2.651071429 +210.9572901,-197.03125,-2.55125 +210.9572901,-181.875,-2.436428571 +210.9572901,-166.71875,-2.306607143 +210.9572901,-151.5625,-2.161696429 +210.9572901,-136.40625,-2.001875 +210.9572901,-121.25,-1.826964286 +210.9572901,-106.09375,-1.637053571 +210.9572901,-90.9375,-1.432142857 +210.9572901,-75.78125,-1.212232143 +210.9572901,-60.625,-0.977321429 +210.9572901,-45.46875,-0.727419643 +210.9572901,-30.3125,-0.462482143 +210.9572901,-15.15625,-0.182535714 +210.9572901,0,0.134571429 +210.9572901,15.15625,0.5185 +210.9572901,30.3125,0.917767857 +210.9572901,45.46875,1.332321429 +210.9572901,60.625,1.762232143 +210.9572901,75.78125,2.207410714 +210.9572901,90.9375,2.667857143 +210.9572901,106.09375,3.143660714 +210.9572901,121.25,3.634821429 +210.9572901,136.40625,4.14125 +210.9572901,151.5625,4.663035714 +210.9572901,166.71875,5.200089286 +210.9572901,181.875,5.7525 +210.9572901,197.03125,6.320178571 +210.9572901,212.1875,6.903125 +210.9572901,227.34375,7.501517857 +210.9572901,242.5,8.115089286 +210.9572901,257.65625,8.744107143 +210.9572901,272.8125,9.388392857 +210.9572901,287.96875,10.04821429 +210.9572901,303.125,10.72321429 +210.9572901,318.28125,11.41339286 +210.9572901,333.4375,12.11875 +210.9572901,348.59375,12.83928571 +210.9572901,363.75,13.57589286 +210.9572901,378.90625,14.32678571 +210.9572901,394.0625,15.09375 +210.9572901,409.21875,15.87589286 +210.9572901,424.375,16.67321429 +210.9572901,439.53125,17.48571429 +210.9572901,454.6875,18.31428571 +210.9572901,469.84375,19.15714286 +210.9572901,485,20.01607143 +281.281296,-485,-5.384375 +281.281296,-469.84375,-5.444107143 +281.281296,-454.6875,-5.488839286 +281.281296,-439.53125,-5.518571429 +281.281296,-424.375,-5.533303571 +281.281296,-409.21875,-5.533035714 +281.281296,-394.0625,-5.517767857 +281.281296,-378.90625,-5.487410714 +281.281296,-363.75,-5.442053571 +281.281296,-348.59375,-5.381785714 +281.281296,-333.4375,-5.306428571 +281.281296,-318.28125,-5.216071429 +281.281296,-303.125,-5.110714286 +281.281296,-287.96875,-4.990357143 +281.281296,-272.8125,-4.855 +281.281296,-257.65625,-4.704553571 +281.281296,-242.5,-4.539196429 +281.281296,-227.34375,-4.35875 +281.281296,-212.1875,-4.163303571 +281.281296,-197.03125,-3.952857143 +281.281296,-181.875,-3.7275 +281.281296,-166.71875,-3.486964286 +281.281296,-151.5625,-3.231517857 +281.281296,-136.40625,-2.961071429 +281.281296,-121.25,-2.675625 +281.281296,-106.09375,-2.375089286 +281.281296,-90.9375,-2.059553571 +281.281296,-75.78125,-1.729107143 +281.281296,-60.625,-1.383571429 +281.281296,-45.46875,-1.023035714 +281.281296,-30.3125,-0.647491071 +281.281296,-15.15625,-0.2569375 +281.281296,0,0.172 +281.281296,15.15625,0.668767857 +281.281296,30.3125,1.180892857 +281.281296,45.46875,1.708214286 +281.281296,60.625,2.250982143 +281.281296,75.78125,2.809017857 +281.281296,90.9375,3.382321429 +281.281296,106.09375,3.970982143 +281.281296,121.25,4.574910714 +281.281296,136.40625,5.194196429 +281.281296,151.5625,5.828839286 +281.281296,166.71875,6.478660714 +281.281296,181.875,7.143928571 +281.281296,197.03125,7.824464286 +281.281296,212.1875,8.520267857 +281.281296,227.34375,9.23125 +281.281296,242.5,9.958035714 +281.281296,257.65625,10.7 +281.281296,272.8125,11.45714286 +281.281296,287.96875,12.22946429 +281.281296,303.125,13.01696429 +281.281296,318.28125,13.81964286 +281.281296,333.4375,14.63839286 +281.281296,348.59375,15.47232143 +281.281296,363.75,16.32053571 +281.281296,378.90625,17.18482143 +281.281296,394.0625,18.06517857 +281.281296,409.21875,18.95982143 +281.281296,424.375,19.86964286 +281.281296,439.53125,20.79553571 +281.281296,454.6875,21.73660714 +281.281296,469.84375,22.69285714 +281.281296,485,23.66428571 +351.5905744,-485,-8.885803571 +351.5905744,-469.84375,-8.834910714 +351.5905744,-454.6875,-8.769107143 +351.5905744,-439.53125,-8.688214286 +351.5905744,-424.375,-8.592321429 +351.5905744,-409.21875,-8.481428571 +351.5905744,-394.0625,-8.355535714 +351.5905744,-378.90625,-8.214642857 +351.5905744,-363.75,-8.05875 +351.5905744,-348.59375,-7.887767857 +351.5905744,-333.4375,-7.701785714 +351.5905744,-318.28125,-7.500892857 +351.5905744,-303.125,-7.284910714 +351.5905744,-287.96875,-7.053928571 +351.5905744,-272.8125,-6.807946429 +351.5905744,-257.65625,-6.546964286 +351.5905744,-242.5,-6.270982143 +351.5905744,-227.34375,-5.979910714 +351.5905744,-212.1875,-5.673928571 +351.5905744,-197.03125,-5.352857143 +351.5905744,-181.875,-5.016875 +351.5905744,-166.71875,-4.665803571 +351.5905744,-151.5625,-4.299732143 +351.5905744,-136.40625,-3.918660714 +351.5905744,-121.25,-3.522589286 +351.5905744,-106.09375,-3.111517857 +351.5905744,-90.9375,-2.685357143 +351.5905744,-75.78125,-2.244285714 +351.5905744,-60.625,-1.788125 +351.5905744,-45.46875,-1.316964286 +351.5905744,-30.3125,-0.830866071 +351.5905744,-15.15625,-0.329714286 +351.5905744,0,0.211080357 +351.5905744,15.15625,0.8206875 +351.5905744,30.3125,1.445625 +351.5905744,45.46875,2.085803571 +351.5905744,60.625,2.741428571 +351.5905744,75.78125,3.412232143 +351.5905744,90.9375,4.098392857 +351.5905744,106.09375,4.799910714 +351.5905744,121.25,5.516696429 +351.5905744,136.40625,6.248839286 +351.5905744,151.5625,6.99625 +351.5905744,166.71875,7.759017857 +351.5905744,181.875,8.537053571 +351.5905744,197.03125,9.330357143 +351.5905744,212.1875,10.13928571 +351.5905744,227.34375,10.96339286 +351.5905744,242.5,11.80267857 +351.5905744,257.65625,12.65714286 +351.5905744,272.8125,13.52678571 +351.5905744,287.96875,14.4125 +351.5905744,303.125,15.3125 +351.5905744,318.28125,16.22857143 +351.5905744,333.4375,17.15982143 +351.5905744,348.59375,18.10625 +351.5905744,363.75,19.06785714 +351.5905744,378.90625,20.04553571 +351.5905744,394.0625,21.0375 +351.5905744,409.21875,22.04553571 +351.5905744,424.375,23.06875 +351.5905744,439.53125,24.10714286 +351.5905744,454.6875,25.16071429 +351.5905744,469.84375,26.22946429 +351.5905744,485,27.31428571 +421.9145803,-485,-12.38571429 +421.9145803,-469.84375,-12.22410714 +421.9145803,-454.6875,-12.04732143 +421.9145803,-439.53125,-11.85625 +421.9145803,-424.375,-11.65 +421.9145803,-409.21875,-11.42857143 +421.9145803,-394.0625,-11.19196429 +421.9145803,-378.90625,-10.94017857 +421.9145803,-363.75,-10.67410714 +421.9145803,-348.59375,-10.39196429 +421.9145803,-333.4375,-10.09553571 +421.9145803,-318.28125,-9.783928571 +421.9145803,-303.125,-9.457142857 +421.9145803,-287.96875,-9.116071429 +421.9145803,-272.8125,-8.759375 +421.9145803,-257.65625,-8.387767857 +421.9145803,-242.5,-8.001160714 +421.9145803,-227.34375,-7.599553571 +421.9145803,-212.1875,-7.182857143 +421.9145803,-197.03125,-6.75125 +421.9145803,-181.875,-6.304642857 +421.9145803,-166.71875,-5.842946429 +421.9145803,-151.5625,-5.366339286 +421.9145803,-136.40625,-4.874642857 +421.9145803,-121.25,-4.367946429 +421.9145803,-106.09375,-3.84625 +421.9145803,-90.9375,-3.309553571 +421.9145803,-75.78125,-2.757857143 +421.9145803,-60.625,-2.191071429 +421.9145803,-45.46875,-1.609375 +421.9145803,-30.3125,-1.012589286 +421.9145803,-15.15625,-0.400857143 +421.9145803,0,0.251830357 +421.9145803,15.15625,0.974285714 +421.9145803,30.3125,1.712053571 +421.9145803,45.46875,2.465089286 +421.9145803,60.625,3.233482143 +421.9145803,75.78125,4.017142857 +421.9145803,90.9375,4.816160714 +421.9145803,106.09375,5.630535714 +421.9145803,121.25,6.460178571 +421.9145803,136.40625,7.305089286 +421.9145803,151.5625,8.165357143 +421.9145803,166.71875,9.041071429 +421.9145803,181.875,9.932142857 +421.9145803,197.03125,10.83839286 +421.9145803,212.1875,11.75982143 +421.9145803,227.34375,12.69642857 +421.9145803,242.5,13.64821429 +421.9145803,257.65625,14.61607143 +421.9145803,272.8125,15.59910714 +421.9145803,287.96875,16.59642857 +421.9145803,303.125,17.60982143 +421.9145803,318.28125,18.63928571 +421.9145803,333.4375,19.68303571 +421.9145803,348.59375,20.74196429 +421.9145803,363.75,21.81696429 +421.9145803,378.90625,22.90714286 +421.9145803,394.0625,24.0125 +421.9145803,409.21875,25.13303571 +421.9145803,424.375,26.26875 +421.9145803,439.53125,27.41964286 +421.9145803,454.6875,28.58660714 +421.9145803,469.84375,29.76785714 +421.9145803,485,30.96517857 +492.2385862,-485,-15.88392857 +492.2385862,-469.84375,-15.61160714 +492.2385862,-454.6875,-15.325 +492.2385862,-439.53125,-15.02232143 +492.2385862,-424.375,-14.70535714 +492.2385862,-409.21875,-14.37321429 +492.2385862,-394.0625,-14.02589286 +492.2385862,-378.90625,-13.66428571 +492.2385862,-363.75,-13.28660714 +492.2385862,-348.59375,-12.89464286 +492.2385862,-333.4375,-12.4875 +492.2385862,-318.28125,-12.06517857 +492.2385862,-303.125,-11.62857143 +492.2385862,-287.96875,-11.17589286 +492.2385862,-272.8125,-10.70892857 +492.2385862,-257.65625,-10.22678571 +492.2385862,-242.5,-9.729464286 +492.2385862,-227.34375,-9.217857143 +492.2385862,-212.1875,-8.690267857 +492.2385862,-197.03125,-8.148035714 +492.2385862,-181.875,-7.590714286 +492.2385862,-166.71875,-7.018482143 +492.2385862,-151.5625,-6.43125 +492.2385862,-136.40625,-5.828928571 +492.2385862,-121.25,-5.211696429 +492.2385862,-106.09375,-4.579375 +492.2385862,-90.9375,-3.932053571 +492.2385862,-75.78125,-3.269732143 +492.2385862,-60.625,-2.592410714 +492.2385862,-45.46875,-1.900089286 +492.2385862,-30.3125,-1.192767857 +492.2385862,-15.15625,-0.470383929 +492.2385862,0,0.294232143 +492.2385862,15.15625,1.129553571 +492.2385862,30.3125,1.980089286 +492.2385862,45.46875,2.845982143 +492.2385862,60.625,3.727232143 +492.2385862,75.78125,4.62375 +492.2385862,90.9375,5.535625 +492.2385862,106.09375,6.462767857 +492.2385862,121.25,7.405267857 +492.2385862,136.40625,8.363035714 +492.2385862,151.5625,9.335714286 +492.2385862,166.71875,10.32410714 +492.2385862,181.875,11.32857143 +492.2385862,197.03125,12.34732143 +492.2385862,212.1875,13.38125 +492.2385862,227.34375,14.43125 +492.2385862,242.5,15.49642857 +492.2385862,257.65625,16.57678571 +492.2385862,272.8125,17.67232143 +492.2385862,287.96875,18.78303571 +492.2385862,303.125,19.90892857 +492.2385862,318.28125,21.05089286 +492.2385862,333.4375,22.20803571 +492.2385862,348.59375,23.37946429 +492.2385862,363.75,24.56696429 +492.2385862,378.90625,25.77053571 +492.2385862,394.0625,26.98839286 +492.2385862,409.21875,28.22142857 +492.2385862,424.375,29.47053571 +492.2385862,439.53125,30.73482143 +492.2385862,454.6875,32.01428571 +492.2385862,469.84375,33.30892857 +492.2385862,485,34.61875 +562.5478645,-485,-19.38035714 +562.5478645,-469.84375,-18.99732143 +562.5478645,-454.6875,-18.6 +562.5478645,-439.53125,-18.1875 +562.5478645,-424.375,-17.75982143 +562.5478645,-409.21875,-17.31696429 +562.5478645,-394.0625,-16.85892857 +562.5478645,-378.90625,-16.38660714 +562.5478645,-363.75,-15.89910714 +562.5478645,-348.59375,-15.39642857 +562.5478645,-333.4375,-14.87857143 +562.5478645,-318.28125,-14.34553571 +562.5478645,-303.125,-13.79821429 +562.5478645,-287.96875,-13.23482143 +562.5478645,-272.8125,-12.65714286 +562.5478645,-257.65625,-12.06428571 +562.5478645,-242.5,-11.45625 +562.5478645,-227.34375,-10.83392857 +562.5478645,-212.1875,-10.19553571 +562.5478645,-197.03125,-9.542857143 +562.5478645,-181.875,-8.875267857 +562.5478645,-166.71875,-8.192410714 +562.5478645,-151.5625,-7.494553571 +562.5478645,-136.40625,-6.781696429 +562.5478645,-121.25,-6.05375 +562.5478645,-106.09375,-5.310892857 +562.5478645,-90.9375,-4.552946429 +562.5478645,-75.78125,-3.780089286 +562.5478645,-60.625,-2.992142857 +562.5478645,-45.46875,-2.189196429 +562.5478645,-30.3125,-1.37125 +562.5478645,-15.15625,-0.538285714 +562.5478645,0,0.338294643 +562.5478645,15.15625,1.286428571 +562.5478645,30.3125,2.249821429 +562.5478645,45.46875,3.228571429 +562.5478645,60.625,4.222589286 +562.5478645,75.78125,5.231964286 +562.5478645,90.9375,6.256696429 +562.5478645,106.09375,7.296696429 +562.5478645,121.25,8.351964286 +562.5478645,136.40625,9.422321429 +562.5478645,151.5625,10.50892857 +562.5478645,166.71875,11.60982143 +562.5478645,181.875,12.72678571 +562.5478645,197.03125,13.85803571 +562.5478645,212.1875,15.00535714 +562.5478645,227.34375,16.16785714 +562.5478645,242.5,17.34553571 +562.5478645,257.65625,18.53928571 +562.5478645,272.8125,19.74732143 +562.5478645,287.96875,20.97142857 +562.5478645,303.125,22.20982143 +562.5478645,318.28125,23.46428571 +562.5478645,333.4375,24.73392857 +562.5478645,348.59375,26.01875 +562.5478645,363.75,27.31964286 +562.5478645,378.90625,28.63482143 +562.5478645,394.0625,29.96607143 +562.5478645,409.21875,31.3125 +562.5478645,424.375,32.67410714 +562.5478645,439.53125,34.05089286 +562.5478645,454.6875,35.44285714 +562.5478645,469.84375,36.85089286 +562.5478645,485,38.27321429 +632.8718704,-485,-22.875 +632.8718704,-469.84375,-22.38214286 +632.8718704,-454.6875,-21.87410714 +632.8718704,-439.53125,-21.35 +632.8718704,-424.375,-20.8125 +632.8718704,-409.21875,-20.25892857 +632.8718704,-394.0625,-19.69017857 +632.8718704,-378.90625,-19.10714286 +632.8718704,-363.75,-18.50892857 +632.8718704,-348.59375,-17.89553571 +632.8718704,-333.4375,-17.26696429 +632.8718704,-318.28125,-16.62410714 +632.8718704,-303.125,-15.96517857 +632.8718704,-287.96875,-15.29196429 +632.8718704,-272.8125,-14.60357143 +632.8718704,-257.65625,-13.9 +632.8718704,-242.5,-13.18214286 +632.8718704,-227.34375,-12.44821429 +632.8718704,-212.1875,-11.7 +632.8718704,-197.03125,-10.93660714 +632.8718704,-181.875,-10.15803571 +632.8718704,-166.71875,-9.364285714 +632.8718704,-151.5625,-8.55625 +632.8718704,-136.40625,-7.732767857 +632.8718704,-121.25,-6.894285714 +632.8718704,-106.09375,-6.040803571 +632.8718704,-90.9375,-5.172232143 +632.8718704,-75.78125,-4.28875 +632.8718704,-60.625,-3.390178571 +632.8718704,-45.46875,-2.476696429 +632.8718704,-30.3125,-1.548125 +632.8718704,-15.15625,-0.6045625 +632.8718704,0,0.384017857 +632.8718704,15.15625,1.445 +632.8718704,30.3125,2.52125 +632.8718704,45.46875,3.612767857 +632.8718704,60.625,4.719732143 +632.8718704,75.78125,5.841875 +632.8718704,90.9375,6.979375 +632.8718704,106.09375,8.132232143 +632.8718704,121.25,9.3 +632.8718704,136.40625,10.48392857 +632.8718704,151.5625,11.68303571 +632.8718704,166.71875,12.89642857 +632.8718704,181.875,14.12589286 +632.8718704,197.03125,15.37053571 +632.8718704,212.1875,16.63125 +632.8718704,227.34375,17.90625 +632.8718704,242.5,19.19642857 +632.8718704,257.65625,20.50267857 +632.8718704,272.8125,21.82410714 +632.8718704,287.96875,23.16071429 +632.8718704,303.125,24.5125 +632.8718704,318.28125,25.87946429 +632.8718704,333.4375,27.2625 +632.8718704,348.59375,28.65982143 +632.8718704,363.75,30.07321429 +632.8718704,378.90625,31.50178571 +632.8718704,394.0625,32.94553571 +632.8718704,409.21875,34.40446429 +632.8718704,424.375,35.87946429 +632.8718704,439.53125,37.36875 +632.8718704,454.6875,38.87410714 +632.8718704,469.84375,40.39375 +632.8718704,485,41.92946429 +703.1811487,-485,-26.36875 +703.1811487,-469.84375,-25.76428571 +703.1811487,-454.6875,-25.14553571 +703.1811487,-439.53125,-24.51160714 +703.1811487,-424.375,-23.86339286 +703.1811487,-409.21875,-23.19910714 +703.1811487,-394.0625,-22.52053571 +703.1811487,-378.90625,-21.82589286 +703.1811487,-363.75,-21.11696429 +703.1811487,-348.59375,-20.39375 +703.1811487,-333.4375,-19.65446429 +703.1811487,-318.28125,-18.90089286 +703.1811487,-303.125,-18.13125 +703.1811487,-287.96875,-17.34732143 +703.1811487,-272.8125,-16.54821429 +703.1811487,-257.65625,-15.73482143 +703.1811487,-242.5,-14.90535714 +703.1811487,-227.34375,-14.06160714 +703.1811487,-212.1875,-13.20267857 +703.1811487,-197.03125,-12.32857143 +703.1811487,-181.875,-11.43928571 +703.1811487,-166.71875,-10.53571429 +703.1811487,-151.5625,-9.616071429 +703.1811487,-136.40625,-8.682232143 +703.1811487,-121.25,-7.733125 +703.1811487,-106.09375,-6.769017857 +703.1811487,-90.9375,-5.789910714 +703.1811487,-75.78125,-4.795803571 +703.1811487,-60.625,-3.786696429 +703.1811487,-45.46875,-2.7625 +703.1811487,-30.3125,-1.723392857 +703.1811487,-15.15625,-0.669205357 +703.1811487,0,0.431401786 +703.1811487,15.15625,1.605178571 +703.1811487,30.3125,2.794285714 +703.1811487,45.46875,3.998660714 +703.1811487,60.625,5.218392857 +703.1811487,75.78125,6.453482143 +703.1811487,90.9375,7.703839286 +703.1811487,106.09375,8.969642857 +703.1811487,121.25,10.25089286 +703.1811487,136.40625,11.54642857 +703.1811487,151.5625,12.85803571 +703.1811487,166.71875,14.18571429 +703.1811487,181.875,15.52767857 +703.1811487,197.03125,16.88482143 +703.1811487,212.1875,18.25803571 +703.1811487,227.34375,19.64642857 +703.1811487,242.5,21.05 +703.1811487,257.65625,22.46875 +703.1811487,272.8125,23.90267857 +703.1811487,287.96875,25.35178571 +703.1811487,303.125,26.81696429 +703.1811487,318.28125,28.29642857 +703.1811487,333.4375,29.79196429 +703.1811487,348.59375,31.30267857 +703.1811487,363.75,32.82857143 +703.1811487,378.90625,34.36964286 +703.1811487,394.0625,35.92678571 +703.1811487,409.21875,37.49821429 +703.1811487,424.375,39.08571429 +703.1811487,439.53125,40.68839286 +703.1811487,454.6875,42.30625 +703.1811487,469.84375,43.93928571 +703.1811487,485,45.5875 +773.5051546,-485,-29.85982143 +773.5051546,-469.84375,-29.14553571 +773.5051546,-454.6875,-28.41607143 +773.5051546,-439.53125,-27.67142857 +773.5051546,-424.375,-26.9125 +773.5051546,-409.21875,-26.1375 +773.5051546,-394.0625,-25.34821429 +773.5051546,-378.90625,-24.54375 +773.5051546,-363.75,-23.72410714 +773.5051546,-348.59375,-22.88928571 +773.5051546,-333.4375,-22.04017857 +773.5051546,-318.28125,-21.17589286 +773.5051546,-303.125,-20.29642857 +773.5051546,-287.96875,-19.40178571 +773.5051546,-272.8125,-18.49196429 +773.5051546,-257.65625,-17.56696429 +773.5051546,-242.5,-16.62767857 +773.5051546,-227.34375,-15.67321429 +773.5051546,-212.1875,-14.70357143 +773.5051546,-197.03125,-13.71875 +773.5051546,-181.875,-12.71875 +773.5051546,-166.71875,-11.70446429 +773.5051546,-151.5625,-10.675 +773.5051546,-136.40625,-9.630357143 +773.5051546,-121.25,-8.570357143 +773.5051546,-106.09375,-7.495625 +773.5051546,-90.9375,-6.405982143 +773.5051546,-75.78125,-5.30125 +773.5051546,-60.625,-4.181517857 +773.5051546,-45.46875,-3.046785714 +773.5051546,-30.3125,-1.896964286 +773.5051546,-15.15625,-0.732223214 +773.5051546,0,0.4804375 +773.5051546,15.15625,1.767053571 +773.5051546,30.3125,3.069017857 +773.5051546,45.46875,4.38625 +773.5051546,60.625,5.718839286 +773.5051546,75.78125,7.066696429 +773.5051546,90.9375,8.429821429 +773.5051546,106.09375,9.808035714 +773.5051546,121.25,11.20178571 +773.5051546,136.40625,12.61160714 +773.5051546,151.5625,14.03571429 +773.5051546,166.71875,15.47589286 +773.5051546,181.875,16.93035714 +773.5051546,197.03125,18.40089286 +773.5051546,212.1875,19.88660714 +773.5051546,227.34375,21.3875 +773.5051546,242.5,22.90357143 +773.5051546,257.65625,24.43571429 +773.5051546,272.8125,25.98214286 +773.5051546,287.96875,27.54464286 +773.5051546,303.125,29.12232143 +773.5051546,318.28125,30.71517857 +773.5051546,333.4375,32.32321429 +773.5051546,348.59375,33.94732143 +773.5051546,363.75,35.58571429 +773.5051546,378.90625,37.24017857 +773.5051546,394.0625,38.90982143 +773.5051546,409.21875,40.59375 +773.5051546,424.375,42.29464286 +773.5051546,439.53125,44.00982143 +773.5051546,454.6875,45.74017857 +773.5051546,469.84375,47.48660714 +773.5051546,485,49.24732143 +843.8291605,-485,-33.35 +843.8291605,-469.84375,-32.525 +843.8291605,-454.6875,-31.68482143 +843.8291605,-439.53125,-30.83035714 +843.8291605,-424.375,-29.95982143 +843.8291605,-409.21875,-29.075 +843.8291605,-394.0625,-28.175 +843.8291605,-378.90625,-27.25982143 +843.8291605,-363.75,-26.32946429 +843.8291605,-348.59375,-25.38392857 +843.8291605,-333.4375,-24.42410714 +843.8291605,-318.28125,-23.44910714 +843.8291605,-303.125,-22.45892857 +843.8291605,-287.96875,-21.45357143 +843.8291605,-272.8125,-20.43303571 +843.8291605,-257.65625,-19.39821429 +843.8291605,-242.5,-18.34821429 +843.8291605,-227.34375,-17.28303571 +843.8291605,-212.1875,-16.20267857 +843.8291605,-197.03125,-15.10714286 +843.8291605,-181.875,-13.99732143 +843.8291605,-166.71875,-12.87142857 +843.8291605,-151.5625,-11.73125 +843.8291605,-136.40625,-10.57589286 +843.8291605,-121.25,-9.40625 +843.8291605,-106.09375,-8.220625 +843.8291605,-90.9375,-7.020357143 +843.8291605,-75.78125,-5.805 +843.8291605,-60.625,-4.574642857 +843.8291605,-45.46875,-3.329375 +843.8291605,-30.3125,-2.069017857 +843.8291605,-15.15625,-0.793625 +843.8291605,0,0.531133929 +843.8291605,15.15625,1.930625 +843.8291605,30.3125,3.345357143 +843.8291605,45.46875,4.775446429 +843.8291605,60.625,6.220803571 +843.8291605,75.78125,7.681517857 +843.8291605,90.9375,9.157142857 +843.8291605,106.09375,10.64910714 +843.8291605,121.25,12.15535714 +843.8291605,136.40625,13.67767857 +843.8291605,151.5625,15.21517857 +843.8291605,166.71875,16.76696429 +843.8291605,181.875,18.33571429 +843.8291605,197.03125,19.91875 +843.8291605,212.1875,21.51696429 +843.8291605,227.34375,23.13125 +843.8291605,242.5,24.75982143 +843.8291605,257.65625,26.40446429 +843.8291605,272.8125,28.06428571 +843.8291605,287.96875,29.73928571 +843.8291605,303.125,31.42946429 +843.8291605,318.28125,33.13571429 +843.8291605,333.4375,34.85625 +843.8291605,348.59375,36.59285714 +843.8291605,363.75,38.34464286 +843.8291605,378.90625,40.11160714 +843.8291605,394.0625,41.89375 +843.8291605,409.21875,43.69107143 +843.8291605,424.375,45.50446429 +843.8291605,439.53125,47.33214286 +843.8291605,454.6875,49.17589286 +843.8291605,469.84375,51.03482143 +843.8291605,485,52.90892857 +1406.377025,-485,-61.21160714 +1406.377025,-469.84375,-59.50178571 +1406.377025,-454.6875,-57.77767857 +1406.377025,-439.53125,-56.0375 +1406.377025,-424.375,-54.28214286 +1406.377025,-409.21875,-52.5125 +1406.377025,-394.0625,-50.72767857 +1406.377025,-378.90625,-48.92767857 +1406.377025,-363.75,-47.1125 +1406.377025,-348.59375,-45.28303571 +1406.377025,-333.4375,-43.4375 +1406.377025,-318.28125,-41.57767857 +1406.377025,-303.125,-39.70267857 +1406.377025,-287.96875,-37.8125 +1406.377025,-272.8125,-35.90803571 +1406.377025,-257.65625,-33.9875 +1406.377025,-242.5,-32.05267857 +1406.377025,-227.34375,-30.10267857 +1406.377025,-212.1875,-28.1375 +1406.377025,-197.03125,-26.15803571 +1406.377025,-181.875,-24.1625 +1406.377025,-166.71875,-22.15267857 +1406.377025,-151.5625,-20.12767857 +1406.377025,-136.40625,-18.0875 +1406.377025,-121.25,-16.03214286 +1406.377025,-106.09375,-13.9625 +1406.377025,-90.9375,-11.87678571 +1406.377025,-75.78125,-9.776785714 +1406.377025,-60.625,-7.661785714 +1406.377025,-45.46875,-5.531607143 +1406.377025,-30.3125,-3.386428571 +1406.377025,-15.15625,-1.22625 +1406.377025,0,0.996428571 +1406.377025,15.15625,3.298571429 +1406.377025,30.3125,5.616071429 +1406.377025,45.46875,7.948839286 +1406.377025,60.625,10.29732143 +1406.377025,75.78125,12.66071429 +1406.377025,90.9375,15.03928571 +1406.377025,106.09375,17.43303571 +1406.377025,121.25,19.84196429 +1406.377025,136.40625,22.26696429 +1406.377025,151.5625,24.70714286 +1406.377025,166.71875,27.1625 +1406.377025,181.875,29.63303571 +1406.377025,197.03125,32.11875 +1406.377025,212.1875,34.61964286 +1406.377025,227.34375,37.13660714 +1406.377025,242.5,39.66875 +1406.377025,257.65625,42.21517857 +1406.377025,272.8125,44.77767857 +1406.377025,287.96875,47.35535714 +1406.377025,303.125,49.94910714 +1406.377025,318.28125,52.55714286 +1406.377025,333.4375,55.18125 +1406.377025,348.59375,57.81964286 +1406.377025,363.75,60.47410714 +1406.377025,378.90625,63.14375 +1406.377025,394.0625,65.82857143 +1406.377025,409.21875,68.52946429 +1406.377025,424.375,71.24464286 +1406.377025,439.53125,73.97589286 +1406.377025,454.6875,76.72232143 +1406.377025,469.84375,79.48392857 +1406.377025,485,82.26071429 +1758.02651,-485,-78.57321429 +1758.02651,-469.84375,-76.30982143 +1758.02651,-454.6875,-74.03214286 +1758.02651,-439.53125,-71.73928571 +1758.02651,-424.375,-69.43125 +1758.02651,-409.21875,-67.10803571 +1758.02651,-394.0625,-64.77053571 +1758.02651,-378.90625,-62.41785714 +1758.02651,-363.75,-60.04910714 +1758.02651,-348.59375,-57.66607143 +1758.02651,-333.4375,-55.26875 +1758.02651,-318.28125,-52.85535714 +1758.02651,-303.125,-50.42767857 +1758.02651,-287.96875,-47.98482143 +1758.02651,-272.8125,-45.52678571 +1758.02651,-257.65625,-43.05357143 +1758.02651,-242.5,-40.56517857 +1758.02651,-227.34375,-38.0625 +1758.02651,-212.1875,-35.54464286 +1758.02651,-197.03125,-33.01160714 +1758.02651,-181.875,-30.46339286 +1758.02651,-166.71875,-27.9 +1758.02651,-151.5625,-25.32232143 +1758.02651,-136.40625,-22.72857143 +1758.02651,-121.25,-20.12053571 +1758.02651,-106.09375,-17.49732143 +1758.02651,-90.9375,-14.85982143 +1758.02651,-75.78125,-12.20625 +1758.02651,-60.625,-9.538392857 +1758.02651,-45.46875,-6.855178571 +1758.02651,-30.3125,-4.156964286 +1758.02651,-15.15625,-1.443839286 +1758.02651,0,1.341160714 +1758.02651,15.15625,4.2075 +1758.02651,30.3125,7.089107143 +1758.02651,45.46875,9.985714286 +1758.02651,60.625,12.89821429 +1758.02651,75.78125,15.82589286 +1758.02651,90.9375,18.76875 +1758.02651,106.09375,21.72678571 +1758.02651,121.25,24.70089286 +1758.02651,136.40625,27.68928571 +1758.02651,151.5625,30.69375 +1758.02651,166.71875,33.7125 +1758.02651,181.875,36.74732143 +1758.02651,197.03125,39.79821429 +1758.02651,212.1875,42.86339286 +1758.02651,227.34375,45.94375 +1758.02651,242.5,49.04017857 +1758.02651,257.65625,52.15089286 +1758.02651,272.8125,55.27767857 +1758.02651,287.96875,58.41964286 +1758.02651,303.125,61.57678571 +1758.02651,318.28125,64.75 +1758.02651,333.4375,67.9375 +1758.02651,348.59375,71.14107143 +1758.02651,363.75,74.35892857 +1758.02651,378.90625,77.59285714 +1758.02651,394.0625,80.84196429 +1758.02651,409.21875,84.10714286 +1758.02651,424.375,87.38660714 +1758.02651,439.53125,90.67857143 +1758.02651,454.6875,93.99107143 +1758.02651,469.84375,97.32142857 +1758.02651,485,100.6607143 +2109.572901,-485,-95.89285714 +2109.572901,-469.84375,-93.08035714 +2109.572901,-454.6875,-90.25 +2109.572901,-439.53125,-87.4 +2109.572901,-424.375,-84.53928571 +2109.572901,-409.21875,-81.66339286 +2109.572901,-394.0625,-78.77232143 +2109.572901,-378.90625,-75.86607143 +2109.572901,-363.75,-72.94553571 +2109.572901,-348.59375,-70.00982143 +2109.572901,-333.4375,-67.05892857 +2109.572901,-318.28125,-64.09285714 +2109.572901,-303.125,-61.11160714 +2109.572901,-287.96875,-58.11517857 +2109.572901,-272.8125,-55.10446429 +2109.572901,-257.65625,-52.07857143 +2109.572901,-242.5,-49.0375 +2109.572901,-227.34375,-45.98125 +2109.572901,-212.1875,-42.91071429 +2109.572901,-197.03125,-39.82410714 +2109.572901,-181.875,-36.72321429 +2109.572901,-166.71875,-33.60714286 +2109.572901,-151.5625,-30.47589286 +2109.572901,-136.40625,-27.33035714 +2109.572901,-121.25,-24.16875 +2109.572901,-106.09375,-20.99285714 +2109.572901,-90.9375,-17.80178571 +2109.572901,-75.78125,-14.59553571 +2109.572901,-60.625,-11.37410714 +2109.572901,-45.46875,-8.138125 +2109.572901,-30.3125,-4.886964286 +2109.572901,-15.15625,-1.620714286 +2109.572901,0,1.727321429 +2109.572901,15.15625,5.157857143 +2109.572901,30.3125,8.603660714 +2109.572901,45.46875,12.06517857 +2109.572901,60.625,15.54107143 +2109.572901,75.78125,19.03303571 +2109.572901,90.9375,22.54017857 +2109.572901,106.09375,26.0625 +2109.572901,121.25,29.6 +2109.572901,136.40625,33.15267857 +2109.572901,151.5625,36.72142857 +2109.572901,166.71875,40.30535714 +2109.572901,181.875,43.90446429 +2109.572901,197.03125,47.51785714 +2109.572901,212.1875,51.14821429 +2109.572901,227.34375,54.79285714 +2109.572901,242.5,58.45267857 +2109.572901,257.65625,62.12857143 +2109.572901,272.8125,65.81964286 +2109.572901,287.96875,69.525 +2109.572901,303.125,73.24732143 +2109.572901,318.28125,76.98392857 +2109.572901,333.4375,80.73571429 +2109.572901,348.59375,84.50357143 +2109.572901,363.75,88.28571429 +2109.572901,378.90625,92.08035714 +2109.572901,394.0625,95.89285714 +2109.572901,409.21875,99.72321429 +2109.572901,424.375,103.5714286 +2109.572901,439.53125,107.4285714 +2109.572901,454.6875,111.3035714 +2109.572901,469.84375,115.1964286 +2109.572901,485,119.0982143 +2461.119293,-485,-113.1696429 +2461.119293,-469.84375,-109.8035714 +2461.119293,-454.6875,-106.4196429 +2461.119293,-439.53125,-103.0178571 +2461.119293,-424.375,-99.60714286 +2461.119293,-409.21875,-96.17857143 +2461.119293,-394.0625,-92.73214286 +2461.119293,-378.90625,-89.275 +2461.119293,-363.75,-85.80089286 +2461.119293,-348.59375,-82.31160714 +2461.119293,-333.4375,-78.80803571 +2461.119293,-318.28125,-75.28928571 +2461.119293,-303.125,-71.75535714 +2461.119293,-287.96875,-68.20625 +2461.119293,-272.8125,-64.64196429 +2461.119293,-257.65625,-61.06339286 +2461.119293,-242.5,-57.46875 +2461.119293,-227.34375,-53.85982143 +2461.119293,-212.1875,-50.23571429 +2461.119293,-197.03125,-46.59642857 +2461.119293,-181.875,-42.94285714 +2461.119293,-166.71875,-39.27321429 +2461.119293,-151.5625,-35.58928571 +2461.119293,-136.40625,-31.89017857 +2461.119293,-121.25,-28.17589286 +2461.119293,-106.09375,-24.44732143 +2461.119293,-90.9375,-20.70267857 +2461.119293,-75.78125,-16.94375 +2461.119293,-60.625,-13.16964286 +2461.119293,-45.46875,-9.380357143 +2461.119293,-30.3125,-5.576160714 +2461.119293,-15.15625,-1.756964286 +2461.119293,0,2.155 +2461.119293,15.15625,6.149642857 +2461.119293,30.3125,10.15982143 +2461.119293,45.46875,14.18482143 +2461.119293,60.625,18.22589286 +2461.119293,75.78125,22.28125 +2461.119293,90.9375,26.35267857 +2461.119293,106.09375,30.43928571 +2461.119293,121.25,34.54107143 +2461.119293,136.40625,38.65803571 +2461.119293,151.5625,42.79107143 +2461.119293,166.71875,46.93839286 +2461.119293,181.875,51.10178571 +2461.119293,197.03125,55.28035714 +2461.119293,212.1875,59.47410714 +2461.119293,227.34375,63.68303571 +2461.119293,242.5,67.90714286 +2461.119293,257.65625,72.14732143 +2461.119293,272.8125,76.40178571 +2461.119293,287.96875,80.67232143 +2461.119293,303.125,84.95803571 +2461.119293,318.28125,89.25892857 +2461.119293,333.4375,93.57142857 +2461.119293,348.59375,97.91071429 +2461.119293,363.75,102.25 +2461.119293,378.90625,106.6160714 +2461.119293,394.0625,110.9910714 +2461.119293,409.21875,115.3839286 +2461.119293,424.375,119.7946429 +2461.119293,439.53125,124.2142857 +2461.119293,454.6875,128.6607143 +2461.119293,469.84375,133.1071429 +2461.119293,485,137.5803571 +2812.81296,-485,-130.4107143 +2812.81296,-469.84375,-126.4910714 +2812.81296,-454.6875,-122.5535714 +2812.81296,-439.53125,-118.5982143 +2812.81296,-424.375,-114.6339286 +2812.81296,-409.21875,-110.6517857 +2812.81296,-394.0625,-106.6517857 +2812.81296,-378.90625,-102.6428571 +2812.81296,-363.75,-98.61607143 +2812.81296,-348.59375,-94.57142857 +2812.81296,-333.4375,-90.51785714 +2812.81296,-318.28125,-86.44464286 +2812.81296,-303.125,-82.35803571 +2812.81296,-287.96875,-78.25535714 +2812.81296,-272.8125,-74.13839286 +2812.81296,-257.65625,-70.00625 +2812.81296,-242.5,-65.85982143 +2812.81296,-227.34375,-61.69732143 +2812.81296,-212.1875,-57.52053571 +2812.81296,-197.03125,-53.32857143 +2812.81296,-181.875,-49.12142857 +2812.81296,-166.71875,-44.89910714 +2812.81296,-151.5625,-40.6625 +2812.81296,-136.40625,-36.40982143 +2812.81296,-121.25,-32.14285714 +2812.81296,-106.09375,-27.86071429 +2812.81296,-90.9375,-23.56339286 +2812.81296,-75.78125,-19.25178571 +2812.81296,-60.625,-14.92410714 +2812.81296,-45.46875,-10.58214286 +2812.81296,-30.3125,-6.224821429 +2812.81296,-15.15625,-1.852589286 +2812.81296,0,2.624107143 +2812.81296,15.15625,7.182946429 +2812.81296,30.3125,11.75714286 +2812.81296,45.46875,16.34642857 +2812.81296,60.625,20.95178571 +2812.81296,75.78125,25.57142857 +2812.81296,90.9375,30.20714286 +2812.81296,106.09375,34.85803571 +2812.81296,121.25,39.52410714 +2812.81296,136.40625,44.20535714 +2812.81296,151.5625,48.90178571 +2812.81296,166.71875,53.61339286 +2812.81296,181.875,58.34107143 +2812.81296,197.03125,63.08392857 +2812.81296,212.1875,67.84196429 +2812.81296,227.34375,72.61517857 +2812.81296,242.5,77.40357143 +2812.81296,257.65625,82.20714286 +2812.81296,272.8125,87.02678571 +2812.81296,287.96875,91.85714286 +2812.81296,303.125,96.71428571 +2812.81296,318.28125,101.5803571 +2812.81296,333.4375,106.4553571 +2812.81296,348.59375,111.3482143 +2812.81296,363.75,116.2589286 +2812.81296,378.90625,121.1875 +2812.81296,394.0625,126.1339286 +2812.81296,409.21875,131.0892857 +2812.81296,424.375,136.0625 +2812.81296,439.53125,141.0446429 +2812.81296,454.6875,146.0535714 +2812.81296,469.84375,151.0714286 +2812.81296,485,156.1071429 +3164.359352,-485,-147.6071429 +3164.359352,-469.84375,-143.1339286 +3164.359352,-454.6875,-138.6428571 +3164.359352,-439.53125,-134.1428571 +3164.359352,-424.375,-129.6160714 +3164.359352,-409.21875,-125.0892857 +3164.359352,-394.0625,-120.5357143 +3164.359352,-378.90625,-115.9732143 +3164.359352,-363.75,-111.3928571 +3164.359352,-348.59375,-106.7946429 +3164.359352,-333.4375,-102.1875 +3164.359352,-318.28125,-97.5625 +3164.359352,-303.125,-92.91964286 +3164.359352,-287.96875,-88.26517857 +3164.359352,-272.8125,-83.59464286 +3164.359352,-257.65625,-78.90982143 +3164.359352,-242.5,-74.20982143 +3164.359352,-227.34375,-69.49464286 +3164.359352,-212.1875,-64.76428571 +3164.359352,-197.03125,-60.01964286 +3164.359352,-181.875,-55.25982143 +3164.359352,-166.71875,-50.48392857 +3164.359352,-151.5625,-45.69375 +3164.359352,-136.40625,-40.88928571 +3164.359352,-121.25,-36.06875 +3164.359352,-106.09375,-31.23392857 +3164.359352,-90.9375,-26.38392857 +3164.359352,-75.78125,-21.51875 +3164.359352,-60.625,-16.63839286 +3164.359352,-45.46875,-11.74285714 +3164.359352,-30.3125,-6.832857143 +3164.359352,-15.15625,-1.907589286 +3164.359352,0,3.134642857 +3164.359352,15.15625,8.257678571 +3164.359352,30.3125,13.39642857 +3164.359352,45.46875,18.55 +3164.359352,60.625,23.71875 +3164.359352,75.78125,28.90267857 +3164.359352,90.9375,34.10267857 +3164.359352,106.09375,39.31785714 +3164.359352,121.25,44.54732143 +3164.359352,136.40625,49.79285714 +3164.359352,151.5625,55.05446429 +3164.359352,166.71875,60.33035714 +3164.359352,181.875,65.62142857 +3164.359352,197.03125,70.92857143 +3164.359352,212.1875,76.25089286 +3164.359352,227.34375,81.58839286 +3164.359352,242.5,86.94107143 +3164.359352,257.65625,92.3125 +3164.359352,272.8125,97.69642857 +3164.359352,287.96875,103.0892857 +3164.359352,303.125,108.5089286 +3164.359352,318.28125,113.9375 +3164.359352,333.4375,119.375 +3164.359352,348.59375,124.8392857 +3164.359352,363.75,130.3125 +3164.359352,378.90625,135.8035714 +3164.359352,394.0625,141.3125 +3164.359352,409.21875,146.8303571 +3164.359352,424.375,152.3660714 +3164.359352,439.53125,157.9196429 +3164.359352,454.6875,163.4910714 +3164.359352,469.84375,169.0714286 +3164.359352,485,174.6696429 +3515.905744,-485,-164.7678571 +3515.905744,-469.84375,-159.7410714 +3515.905744,-454.6875,-154.6964286 +3515.905744,-439.53125,-149.6339286 +3515.905744,-424.375,-144.5625 +3515.905744,-409.21875,-139.4732143 +3515.905744,-394.0625,-134.375 +3515.905744,-378.90625,-129.2589286 +3515.905744,-363.75,-124.125 +3515.905744,-348.59375,-118.9732143 +3515.905744,-333.4375,-113.8125 +3515.905744,-318.28125,-108.6339286 +3515.905744,-303.125,-103.4375 +3515.905744,-287.96875,-98.23214286 +3515.905744,-272.8125,-93.00892857 +3515.905744,-257.65625,-87.77232143 +3515.905744,-242.5,-82.51875 +3515.905744,-227.34375,-77.25089286 +3515.905744,-212.1875,-71.96785714 +3515.905744,-197.03125,-66.66964286 +3515.905744,-181.875,-61.35714286 +3515.905744,-166.71875,-56.02857143 +3515.905744,-151.5625,-50.68571429 +3515.905744,-136.40625,-45.32767857 +3515.905744,-121.25,-39.95446429 +3515.905744,-106.09375,-34.56607143 +3515.905744,-90.9375,-29.1625 +3515.905744,-75.78125,-23.74464286 +3515.905744,-60.625,-18.31160714 +3515.905744,-45.46875,-12.86339286 +3515.905744,-30.3125,-7.400178571 +3515.905744,-15.15625,-1.921964286 +3515.905744,0,3.686696429 +3515.905744,15.15625,9.374107143 +3515.905744,30.3125,15.07678571 +3515.905744,45.46875,20.79464286 +3515.905744,60.625,26.52767857 +3515.905744,75.78125,32.27589286 +3515.905744,90.9375,38.03928571 +3515.905744,106.09375,43.81875 +3515.905744,121.25,49.61339286 +3515.905744,136.40625,55.42321429 +3515.905744,151.5625,61.24821429 +3515.905744,166.71875,67.08839286 +3515.905744,181.875,72.94375 +3515.905744,197.03125,78.81517857 +3515.905744,212.1875,84.70089286 +3515.905744,227.34375,90.60714286 +3515.905744,242.5,96.51785714 +3515.905744,257.65625,102.4553571 +3515.905744,272.8125,108.4017857 +3515.905744,287.96875,114.3660714 +3515.905744,303.125,120.3392857 +3515.905744,318.28125,126.3303571 +3515.905744,333.4375,132.3392857 +3515.905744,348.59375,138.3660714 +3515.905744,363.75,144.4107143 +3515.905744,378.90625,150.4642857 +3515.905744,394.0625,156.5267857 +3515.905744,409.21875,162.6160714 +3515.905744,424.375,168.7142857 +3515.905744,439.53125,174.8303571 +3515.905744,454.6875,180.9642857 +3515.905744,469.84375,187.1071429 +3515.905744,485,193.2767857 +3867.599411,-485,-181.8839286 +3867.599411,-469.84375,-176.3035714 +3867.599411,-454.6875,-170.7053571 +3867.599411,-439.53125,-165.0982143 +3867.599411,-424.375,-159.4732143 +3867.599411,-409.21875,-153.8303571 +3867.599411,-394.0625,-148.1696429 +3867.599411,-378.90625,-142.5 +3867.599411,-363.75,-136.8125 +3867.599411,-348.59375,-131.1160714 +3867.599411,-333.4375,-125.4017857 +3867.599411,-318.28125,-119.6696429 +3867.599411,-303.125,-113.9196429 +3867.599411,-287.96875,-108.1607143 +3867.599411,-272.8125,-102.3839286 +3867.599411,-257.65625,-96.59821429 +3867.599411,-242.5,-90.78571429 +3867.599411,-227.34375,-84.96696429 +3867.599411,-212.1875,-79.13035714 +3867.599411,-197.03125,-73.27946429 +3867.599411,-181.875,-67.41339286 +3867.599411,-166.71875,-61.53214286 +3867.599411,-151.5625,-55.63660714 +3867.599411,-136.40625,-49.725 +3867.599411,-121.25,-43.79910714 +3867.599411,-106.09375,-37.85803571 +3867.599411,-90.9375,-31.90178571 +3867.599411,-75.78125,-25.93035714 +3867.599411,-60.625,-19.94464286 +3867.599411,-45.46875,-13.94285714 +3867.599411,-30.3125,-7.926875 +3867.599411,-15.15625,-1.895625 +3867.599411,0,4.280178571 +3867.599411,15.15625,10.53125 +3867.599411,30.3125,16.79821429 +3867.599411,45.46875,23.08035714 +3867.599411,60.625,29.37767857 +3867.599411,75.78125,35.69017857 +3867.599411,90.9375,42.01785714 +3867.599411,106.09375,48.36160714 +3867.599411,121.25,54.72053571 +3867.599411,136.40625,61.09375 +3867.599411,151.5625,67.48303571 +3867.599411,166.71875,73.8875 +3867.599411,181.875,80.30803571 +3867.599411,197.03125,86.74285714 +3867.599411,212.1875,93.19642857 +3867.599411,227.34375,99.66071429 +3867.599411,242.5,106.1428571 +3867.599411,257.65625,112.6339286 +3867.599411,272.8125,119.1517857 +3867.599411,287.96875,125.6785714 +3867.599411,303.125,132.2142857 +3867.599411,318.28125,138.7767857 +3867.599411,333.4375,145.3482143 +3867.599411,348.59375,151.9375 +3867.599411,363.75,158.5446429 +3867.599411,378.90625,165.1607143 +3867.599411,394.0625,171.7946429 +3867.599411,409.21875,178.4464286 +3867.599411,424.375,185.1071429 +3867.599411,439.53125,191.7857143 +3867.599411,454.6875,198.4821429 +3867.599411,469.84375,205.1964286 +3867.599411,485,211.9196429 +4219.145803,-485,-198.9642857 +4219.145803,-469.84375,-192.8303571 +4219.145803,-454.6875,-186.6785714 +4219.145803,-439.53125,-180.5178571 +4219.145803,-424.375,-174.3303571 +4219.145803,-409.21875,-168.1428571 +4219.145803,-394.0625,-161.9285714 +4219.145803,-378.90625,-155.7053571 +4219.145803,-363.75,-149.4642857 +4219.145803,-348.59375,-143.2142857 +4219.145803,-333.4375,-136.9464286 +4219.145803,-318.28125,-130.6607143 +4219.145803,-303.125,-124.3660714 +4219.145803,-287.96875,-118.0446429 +4219.145803,-272.8125,-111.7232143 +4219.145803,-257.65625,-105.375 +4219.145803,-242.5,-99.01785714 +4219.145803,-227.34375,-92.64285714 +4219.145803,-212.1875,-86.25267857 +4219.145803,-197.03125,-79.84910714 +4219.145803,-181.875,-73.42946429 +4219.145803,-166.71875,-66.99553571 +4219.145803,-151.5625,-60.54642857 +4219.145803,-136.40625,-54.08214286 +4219.145803,-121.25,-47.60267857 +4219.145803,-106.09375,-41.10892857 +4219.145803,-90.9375,-34.6 +4219.145803,-75.78125,-28.07589286 +4219.145803,-60.625,-21.53660714 +4219.145803,-45.46875,-14.98214286 +4219.145803,-30.3125,-8.412946429 +4219.145803,-15.15625,-1.828660714 +4219.145803,0,4.915178571 +4219.145803,15.15625,11.73035714 +4219.145803,30.3125,18.56160714 +4219.145803,45.46875,25.40803571 +4219.145803,60.625,32.26964286 +4219.145803,75.78125,39.14642857 +4219.145803,90.9375,46.03839286 +4219.145803,106.09375,52.94553571 +4219.145803,121.25,59.86875 +4219.145803,136.40625,66.80625 +4219.145803,151.5625,73.75982143 +4219.145803,166.71875,80.72857143 +4219.145803,181.875,87.7125 +4219.145803,197.03125,94.71428571 +4219.145803,212.1875,101.7232143 +4219.145803,227.34375,108.7589286 +4219.145803,242.5,115.8035714 +4219.145803,257.65625,122.8660714 +4219.145803,272.8125,129.9375 +4219.145803,287.96875,137.0267857 +4219.145803,303.125,144.1339286 +4219.145803,318.28125,151.2589286 +4219.145803,333.4375,158.3928571 +4219.145803,348.59375,165.5446429 +4219.145803,363.75,172.7142857 +4219.145803,378.90625,179.9017857 +4219.145803,394.0625,187.0982143 +4219.145803,409.21875,194.3125 +4219.145803,424.375,201.5357143 +4219.145803,439.53125,208.7857143 +4219.145803,454.6875,216.0446429 +4219.145803,469.84375,223.3214286 +4219.145803,485,230.6071429 +4570.692194,-485,-216 +4570.692194,-469.84375,-209.3125 +4570.692194,-454.6875,-202.6071429 +4570.692194,-439.53125,-195.8928571 +4570.692194,-424.375,-189.1607143 +4570.692194,-409.21875,-182.4107143 +4570.692194,-394.0625,-175.6517857 +4570.692194,-378.90625,-168.875 +4570.692194,-363.75,-162.0803571 +4570.692194,-348.59375,-155.2767857 +4570.692194,-333.4375,-148.4553571 +4570.692194,-318.28125,-141.6160714 +4570.692194,-303.125,-134.7589286 +4570.692194,-287.96875,-127.8928571 +4570.692194,-272.8125,-121.0089286 +4570.692194,-257.65625,-114.1160714 +4570.692194,-242.5,-107.2053571 +4570.692194,-227.34375,-100.2767857 +4570.692194,-212.1875,-93.33035714 +4570.692194,-197.03125,-86.37767857 +4570.692194,-181.875,-79.40535714 +4570.692194,-166.71875,-72.41785714 +4570.692194,-151.5625,-65.41607143 +4570.692194,-136.40625,-58.39910714 +4570.692194,-121.25,-51.36696429 +4570.692194,-106.09375,-44.31964286 +4570.692194,-90.9375,-37.25714286 +4570.692194,-75.78125,-30.18035714 +4570.692194,-60.625,-23.0875 +4570.692194,-45.46875,-15.98035714 +4570.692194,-30.3125,-8.858303571 +4570.692194,-15.15625,-1.721071429 +4570.692194,0,5.591607143 +4570.692194,15.15625,12.97142857 +4570.692194,30.3125,20.36607143 +4570.692194,45.46875,27.77678571 +4570.692194,60.625,35.20267857 +4570.692194,75.78125,42.64375 +4570.692194,90.9375,50.1 +4570.692194,106.09375,57.57142857 +4570.692194,121.25,65.05803571 +4570.692194,136.40625,72.56071429 +4570.692194,151.5625,80.07857143 +4570.692194,166.71875,87.61160714 +4570.692194,181.875,95.16071429 +4570.692194,197.03125,102.7232143 +4570.692194,212.1875,110.3035714 +4570.692194,227.34375,117.8928571 +4570.692194,242.5,125.5089286 +4570.692194,257.65625,133.1339286 +4570.692194,272.8125,140.7678571 +4570.692194,287.96875,148.4285714 +4570.692194,303.125,156.0982143 +4570.692194,318.28125,163.7857143 +4570.692194,333.4375,171.4821429 +4570.692194,348.59375,179.1964286 +4570.692194,363.75,186.9285714 +4570.692194,378.90625,194.6785714 +4570.692194,394.0625,202.4464286 +4570.692194,409.21875,210.2232143 +4570.692194,424.375,218.0089286 +4570.692194,439.53125,225.8214286 +4570.692194,454.6875,233.6428571 +4570.692194,469.84375,241.4821429 +4570.692194,485,249.3392857 +4922.385862,-485,-232.9910714 +4922.385862,-469.84375,-225.75 +4922.385862,-454.6875,-218.5 +4922.385862,-439.53125,-211.2232143 +4922.385862,-424.375,-203.9375 +4922.385862,-409.21875,-196.6428571 +4922.385862,-394.0625,-189.3303571 +4922.385862,-378.90625,-182 +4922.385862,-363.75,-174.6517857 +4922.385862,-348.59375,-167.2946429 +4922.385862,-333.4375,-159.9196429 +4922.385862,-318.28125,-152.5267857 +4922.385862,-303.125,-145.125 +4922.385862,-287.96875,-137.6964286 +4922.385862,-272.8125,-130.2678571 +4922.385862,-257.65625,-122.8125 +4922.385862,-242.5,-115.3482143 +4922.385862,-227.34375,-107.8660714 +4922.385862,-212.1875,-100.375 +4922.385862,-197.03125,-92.86607143 +4922.385862,-181.875,-85.34017857 +4922.385862,-166.71875,-77.8 +4922.385862,-151.5625,-70.24464286 +4922.385862,-136.40625,-62.67410714 +4922.385862,-121.25,-55.08928571 +4922.385862,-106.09375,-47.48928571 +4922.385862,-90.9375,-39.87410714 +4922.385862,-75.78125,-32.24375 +4922.385862,-60.625,-24.59821429 +4922.385862,-45.46875,-16.93839286 +4922.385862,-30.3125,-9.263392857 +4922.385862,-15.15625,-1.572857143 +4922.385862,0,6.309553571 +4922.385862,15.15625,14.25357143 +4922.385862,30.3125,22.2125 +4922.385862,45.46875,30.1875 +4922.385862,60.625,38.17678571 +4922.385862,75.78125,46.18214286 +4922.385862,90.9375,54.20267857 +4922.385862,106.09375,62.23839286 +4922.385862,121.25,70.29017857 +4922.385862,136.40625,78.35625 +4922.385862,151.5625,86.43839286 +4922.385862,166.71875,94.53571429 +4922.385862,181.875,102.6517857 +4922.385862,197.03125,110.7767857 +4922.385862,212.1875,118.9196429 +4922.385862,227.34375,127.0803571 +4922.385862,242.5,135.25 +4922.385862,257.65625,143.4375 +4922.385862,272.8125,151.6428571 +4922.385862,287.96875,159.8660714 +4922.385862,303.125,168.0982143 +4922.385862,318.28125,176.3482143 +4922.385862,333.4375,184.6160714 +4922.385862,348.59375,192.8928571 +4922.385862,363.75,201.1875 +4922.385862,378.90625,209.5 +4922.385862,394.0625,217.8303571 +4922.385862,409.21875,226.1696429 +4922.385862,424.375,234.5267857 +4922.385862,439.53125,242.9017857 +4922.385862,454.6875,251.2857143 +4922.385862,469.84375,259.6964286 +4922.385862,485,268.1071429 +5273.932253,-485,-249.9464286 +5273.932253,-469.84375,-242.1517857 +5273.932253,-454.6875,-234.3482143 +5273.932253,-439.53125,-226.5178571 +5273.932253,-424.375,-218.6875 +5273.932253,-409.21875,-210.8303571 +5273.932253,-394.0625,-202.9642857 +5273.932253,-378.90625,-195.0803571 +5273.932253,-363.75,-187.1785714 +5273.932253,-348.59375,-179.2678571 +5273.932253,-333.4375,-171.3392857 +5273.932253,-318.28125,-163.3928571 +5273.932253,-303.125,-155.4375 +5273.932253,-287.96875,-147.4642857 +5273.932253,-272.8125,-139.4821429 +5273.932253,-257.65625,-131.4732143 +5273.932253,-242.5,-123.4553571 +5273.932253,-227.34375,-115.4196429 +5273.932253,-212.1875,-107.375 +5273.932253,-197.03125,-99.3125 +5273.932253,-181.875,-91.23214286 +5273.932253,-166.71875,-83.14107143 +5273.932253,-151.5625,-75.03303571 +5273.932253,-136.40625,-66.90982143 +5273.932253,-121.25,-58.77142857 +5273.932253,-106.09375,-50.61875 +5273.932253,-90.9375,-42.45 +5273.932253,-75.78125,-34.26696429 +5273.932253,-60.625,-26.06875 +5273.932253,-45.46875,-17.85535714 +5273.932253,-30.3125,-9.626785714 +5273.932253,-15.15625,-1.383928571 +5273.932253,0,7.068928571 +5273.932253,15.15625,15.57678571 +5273.932253,30.3125,24.10089286 +5273.932253,45.46875,32.63928571 +5273.932253,60.625,41.19285714 +5273.932253,75.78125,49.7625 +5273.932253,90.9375,58.34732143 +5273.932253,106.09375,66.94732143 +5273.932253,121.25,75.5625 +5273.932253,136.40625,84.19285714 +5273.932253,151.5625,92.83928571 +5273.932253,166.71875,101.5 +5273.932253,181.875,110.1785714 +5273.932253,197.03125,118.8660714 +5273.932253,212.1875,127.5803571 +5273.932253,227.34375,136.2946429 +5273.932253,242.5,145.0357143 +5273.932253,257.65625,153.7857143 +5273.932253,272.8125,162.5535714 +5273.932253,287.96875,171.3392857 +5273.932253,303.125,180.1428571 +5273.932253,318.28125,188.9553571 +5273.932253,333.4375,197.7857143 +5273.932253,348.59375,206.6339286 +5273.932253,363.75,215.4910714 +5273.932253,378.90625,224.3660714 +5273.932253,394.0625,233.2589286 +5273.932253,409.21875,242.1607143 +5273.932253,424.375,251.0803571 +5273.932253,439.53125,260.0178571 +5273.932253,454.6875,268.9732143 +5273.932253,469.84375,277.9375 +5273.932253,485,286.9196429 +5625.478645,-485,-266.8571429 +5625.478645,-469.84375,-258.5089286 +5625.478645,-454.6875,-250.1517857 +5625.478645,-439.53125,-241.7767857 +5625.478645,-424.375,-233.3839286 +5625.478645,-409.21875,-224.9821429 +5625.478645,-394.0625,-216.5535714 +5625.478645,-378.90625,-208.125 +5625.478645,-363.75,-199.6696429 +5625.478645,-348.59375,-191.2053571 +5625.478645,-333.4375,-182.7232143 +5625.478645,-318.28125,-174.2321429 +5625.478645,-303.125,-165.7142857 +5625.478645,-287.96875,-157.1875 +5625.478645,-272.8125,-148.6517857 +5625.478645,-257.65625,-140.0892857 +5625.478645,-242.5,-131.5178571 +5625.478645,-227.34375,-122.9375 +5625.478645,-212.1875,-114.3392857 +5625.478645,-197.03125,-105.7232143 +5625.478645,-181.875,-97.08928571 +5625.478645,-166.71875,-88.44196429 +5625.478645,-151.5625,-79.78035714 +5625.478645,-136.40625,-71.10446429 +5625.478645,-121.25,-62.41339286 +5625.478645,-106.09375,-53.70714286 +5625.478645,-90.9375,-44.98571429 +5625.478645,-75.78125,-36.24910714 +5625.478645,-60.625,-27.49821429 +5625.478645,-45.46875,-18.73214286 +5625.478645,-30.3125,-9.950892857 +5625.478645,-15.15625,-1.154375 +5625.478645,0,7.869732143 +5625.478645,15.15625,16.94196429 +5625.478645,30.3125,26.02946429 +5625.478645,45.46875,35.13214286 +5625.478645,60.625,44.25089286 +5625.478645,75.78125,53.38392857 +5625.478645,90.9375,62.53303571 +5625.478645,106.09375,71.69732143 +5625.478645,121.25,80.87678571 +5625.478645,136.40625,90.07142857 +5625.478645,151.5625,99.28571429 +5625.478645,166.71875,108.5089286 +5625.478645,181.875,117.75 +5625.478645,197.03125,127 +5625.478645,212.1875,136.2767857 +5625.478645,227.34375,145.5625 +5625.478645,242.5,154.8660714 +5625.478645,257.65625,164.1785714 +5625.478645,272.8125,173.5178571 +5625.478645,287.96875,182.8660714 +5625.478645,303.125,192.2232143 +5625.478645,318.28125,201.6071429 +5625.478645,333.4375,211 +5625.478645,348.59375,220.4107143 +5625.478645,363.75,229.8303571 +5625.478645,378.90625,239.2678571 +5625.478645,394.0625,248.7232143 +5625.478645,409.21875,258.1964286 +5625.478645,424.375,267.6785714 +5625.478645,439.53125,277.1875 +5625.478645,454.6875,286.6964286 +5625.478645,469.84375,296.2321429 +5625.478645,485,305.7767857 +5977.172312,-485,-283.7321429 +5977.172312,-469.84375,-274.8303571 +5977.172312,-454.6875,-265.9196429 +5977.172312,-439.53125,-256.9910714 +5977.172312,-424.375,-248.0446429 +5977.172312,-409.21875,-239.0892857 +5977.172312,-394.0625,-230.1160714 +5977.172312,-378.90625,-221.125 +5977.172312,-363.75,-212.1160714 +5977.172312,-348.59375,-203.0982143 +5977.172312,-333.4375,-194.0625 +5977.172312,-318.28125,-185.0178571 +5977.172312,-303.125,-175.9553571 +5977.172312,-287.96875,-166.875 +5977.172312,-272.8125,-157.7767857 +5977.172312,-257.65625,-148.6696429 +5977.172312,-242.5,-139.5446429 +5977.172312,-227.34375,-130.4107143 +5977.172312,-212.1875,-121.25 +5977.172312,-197.03125,-112.0803571 +5977.172312,-181.875,-102.9017857 +5977.172312,-166.71875,-93.70535714 +5977.172312,-151.5625,-84.4875 +5977.172312,-136.40625,-75.25803571 +5977.172312,-121.25,-66.01428571 +5977.172312,-106.09375,-56.75446429 +5977.172312,-90.9375,-47.48035714 +5977.172312,-75.78125,-38.19107143 +5977.172312,-60.625,-28.88660714 +5977.172312,-45.46875,-19.56785714 +5977.172312,-30.3125,-10.23392857 +5977.172312,-15.15625,-0.884214286 +5977.172312,0,8.712053571 +5977.172312,15.15625,18.34821429 +5977.172312,30.3125,28 +5977.172312,45.46875,37.66785714 +5977.172312,60.625,47.35 +5977.172312,75.78125,57.04732143 +5977.172312,90.9375,66.76071429 +5977.172312,106.09375,76.48928571 +5977.172312,121.25,86.23303571 +5977.172312,136.40625,95.99107143 +5977.172312,151.5625,105.7678571 +5977.172312,166.71875,115.5535714 +5977.172312,181.875,125.3571429 +5977.172312,197.03125,135.1785714 +5977.172312,212.1875,145.0178571 +5977.172312,227.34375,154.8660714 +5977.172312,242.5,164.7321429 +5977.172312,257.65625,174.6160714 +5977.172312,272.8125,184.5089286 +5977.172312,287.96875,194.4196429 +5977.172312,303.125,204.3482143 +5977.172312,318.28125,214.2946429 +5977.172312,333.4375,224.25 +5977.172312,348.59375,234.2232143 +5977.172312,363.75,244.2142857 +5977.172312,378.90625,254.2142857 +5977.172312,394.0625,264.2410714 +5977.172312,409.21875,274.2678571 +5977.172312,424.375,284.3214286 +5977.172312,439.53125,294.3839286 +5977.172312,454.6875,304.4642857 +5977.172312,469.84375,314.5625 +5977.172312,485,324.6785714 +6328.718704,-485,-300.5625 +6328.718704,-469.84375,-291.1160714 +6328.718704,-454.6875,-281.6428571 +6328.718704,-439.53125,-272.1607143 +6328.718704,-424.375,-262.6696429 +6328.718704,-409.21875,-253.1517857 +6328.718704,-394.0625,-243.625 +6328.718704,-378.90625,-234.0892857 +6328.718704,-363.75,-224.5267857 +6328.718704,-348.59375,-214.9553571 +6328.718704,-333.4375,-205.3660714 +6328.718704,-318.28125,-195.7678571 +6328.718704,-303.125,-186.1517857 +6328.718704,-287.96875,-176.5178571 +6328.718704,-272.8125,-166.875 +6328.718704,-257.65625,-157.2053571 +6328.718704,-242.5,-147.5357143 +6328.718704,-227.34375,-137.8392857 +6328.718704,-212.1875,-128.1339286 +6328.718704,-197.03125,-118.4107143 +6328.718704,-181.875,-108.6696429 +6328.718704,-166.71875,-98.91964286 +6328.718704,-151.5625,-89.15357143 +6328.718704,-136.40625,-79.37142857 +6328.718704,-121.25,-69.57410714 +6328.718704,-106.09375,-59.76160714 +6328.718704,-90.9375,-49.93482143 +6328.718704,-75.78125,-40.09285714 +6328.718704,-60.625,-30.23482143 +6328.718704,-45.46875,-20.3625 +6328.718704,-30.3125,-10.47589286 +6328.718704,-15.15625,-0.573383929 +6328.718704,0,9.595535714 +6328.718704,15.15625,19.79642857 +6328.718704,30.3125,30.0125 +6328.718704,45.46875,40.24375 +6328.718704,60.625,50.49017857 +6328.718704,75.78125,60.75267857 +6328.718704,90.9375,71.02946429 +6328.718704,106.09375,81.32232143 +6328.718704,121.25,91.63392857 +6328.718704,136.40625,101.9553571 +6328.718704,151.5625,112.2946429 +6328.718704,166.71875,122.6428571 +6328.718704,181.875,133.0178571 +6328.718704,197.03125,143.4017857 +6328.718704,212.1875,153.7946429 +6328.718704,227.34375,164.2142857 +6328.718704,242.5,174.6428571 +6328.718704,257.65625,185.0892857 +6328.718704,272.8125,195.5535714 +6328.718704,287.96875,206.0267857 +6328.718704,303.125,216.5178571 +6328.718704,318.28125,227.0267857 +6328.718704,333.4375,237.5446429 +6328.718704,348.59375,248.0892857 +6328.718704,363.75,258.6339286 +6328.718704,378.90625,269.2053571 +6328.718704,394.0625,279.7857143 +6328.718704,409.21875,290.3839286 +6328.718704,424.375,301 +6328.718704,439.53125,311.6339286 +6328.718704,454.6875,322.2767857 +6328.718704,469.84375,332.9375 +6328.718704,485,343.6160714 +6680.265096,-485,-317.3571429 +6680.265096,-469.84375,-307.3482143 +6680.265096,-454.6875,-297.3303571 +6680.265096,-439.53125,-287.2946429 +6680.265096,-424.375,-277.25 +6680.265096,-409.21875,-267.1785714 +6680.265096,-394.0625,-257.0982143 +6680.265096,-378.90625,-247.0089286 +6680.265096,-363.75,-236.8928571 +6680.265096,-348.59375,-226.7678571 +6680.265096,-333.4375,-216.6339286 +6680.265096,-318.28125,-206.4732143 +6680.265096,-303.125,-196.3035714 +6680.265096,-287.96875,-186.1160714 +6680.265096,-272.8125,-175.9196429 +6680.265096,-257.65625,-165.7053571 +6680.265096,-242.5,-155.4732143 +6680.265096,-227.34375,-145.2321429 +6680.265096,-212.1875,-134.9732143 +6680.265096,-197.03125,-124.6964286 +6680.265096,-181.875,-114.4017857 +6680.265096,-166.71875,-104.0982143 +6680.265096,-151.5625,-93.77678571 +6680.265096,-136.40625,-83.44375 +6680.265096,-121.25,-73.09375 +6680.265096,-106.09375,-62.72857143 +6680.265096,-90.9375,-52.34821429 +6680.265096,-75.78125,-41.95267857 +6680.265096,-60.625,-31.54285714 +6680.265096,-45.46875,-21.11785714 +6680.265096,-30.3125,-10.67678571 +6680.265096,-15.15625,-0.221919643 +6680.265096,0,10.52142857 +6680.265096,15.15625,21.28571429 +6680.265096,30.3125,32.06607143 +6680.265096,45.46875,42.86160714 +6680.265096,60.625,53.67232143 +6680.265096,75.78125,64.49821429 +6680.265096,90.9375,75.34017857 +6680.265096,106.09375,86.19642857 +6680.265096,121.25,97.07142857 +6680.265096,136.40625,107.9553571 +6680.265096,151.5625,118.8571429 +6680.265096,166.71875,129.7767857 +6680.265096,181.875,140.7053571 +6680.265096,197.03125,151.6607143 +6680.265096,212.1875,162.625 +6680.265096,227.34375,173.5982143 +6680.265096,242.5,184.5982143 +6680.265096,257.65625,195.6071429 +6680.265096,272.8125,206.6339286 +6680.265096,287.96875,217.6696429 +6680.265096,303.125,228.7232143 +6680.265096,318.28125,239.7946429 +6680.265096,333.4375,250.8839286 +6680.265096,348.59375,261.9821429 +6680.265096,363.75,273.1071429 +6680.265096,378.90625,284.2321429 +6680.265096,394.0625,295.3839286 +6680.265096,409.21875,306.5446429 +6680.265096,424.375,317.7232143 +6680.265096,439.53125,328.9196429 +6680.265096,454.6875,340.125 +6680.265096,469.84375,351.3482143 +6680.265096,485,362.5892857 +7031.811487,-485,-334.1071429 +7031.811487,-469.84375,-323.5535714 +7031.811487,-454.6875,-312.9732143 +7031.811487,-439.53125,-302.3839286 +7031.811487,-424.375,-291.7857143 +7031.811487,-409.21875,-281.1696429 +7031.811487,-394.0625,-270.5357143 +7031.811487,-378.90625,-259.8839286 +7031.811487,-363.75,-249.2232143 +7031.811487,-348.59375,-238.5446429 +7031.811487,-333.4375,-227.8482143 +7031.811487,-318.28125,-217.1428571 +7031.811487,-303.125,-206.4196429 +7031.811487,-287.96875,-195.6785714 +7031.811487,-272.8125,-184.9285714 +7031.811487,-257.65625,-174.1607143 +7031.811487,-242.5,-163.375 +7031.811487,-227.34375,-152.5803571 +7031.811487,-212.1875,-141.7678571 +7031.811487,-197.03125,-130.9375 +7031.811487,-181.875,-120.0982143 +7031.811487,-166.71875,-109.2410714 +7031.811487,-151.5625,-98.36607143 +7031.811487,-136.40625,-87.47589286 +7031.811487,-121.25,-76.57232143 +7031.811487,-106.09375,-65.65446429 +7031.811487,-90.9375,-54.72142857 +7031.811487,-75.78125,-43.77321429 +7031.811487,-60.625,-32.80982143 +7031.811487,-45.46875,-21.83125 +7031.811487,-30.3125,-10.83839286 +7031.811487,-15.15625,0.174098214 +7031.811487,0,11.4875 +7031.811487,15.15625,22.81696429 +7031.811487,30.3125,34.16071429 +7031.811487,45.46875,45.52053571 +7031.811487,60.625,56.89553571 +7031.811487,75.78125,68.28571429 +7031.811487,90.9375,79.69196429 +7031.811487,106.09375,91.11607143 +7031.811487,121.25,102.5446429 +7031.811487,136.40625,114 +7031.811487,151.5625,125.4642857 +7031.811487,166.71875,136.9464286 +7031.811487,181.875,148.4464286 +7031.811487,197.03125,159.9553571 +7031.811487,212.1875,171.4910714 +7031.811487,227.34375,183.0267857 +7031.811487,242.5,194.5892857 +7031.811487,257.65625,206.1607143 +7031.811487,272.8125,217.75 +7031.811487,287.96875,229.3571429 +7031.811487,303.125,240.9732143 +7031.811487,318.28125,252.6160714 +7031.811487,333.4375,264.2589286 +7031.811487,348.59375,275.9285714 +7031.811487,363.75,287.6071429 +7031.811487,378.90625,299.3035714 +7031.811487,394.0625,311.0178571 +7031.811487,409.21875,322.75 +7031.811487,424.375,334.4910714 +7031.811487,439.53125,346.25 +7031.811487,454.6875,358.0178571 +7031.811487,469.84375,369.8035714 +7031.811487,485,381.6071429 +7355.375552,-485,-349.4821429 +7355.375552,-469.84375,-338.4196429 +7355.375552,-454.6875,-327.3303571 +7355.375552,-439.53125,-316.2410714 +7355.375552,-424.375,-305.125 +7355.375552,-409.21875,-294 +7355.375552,-394.0625,-282.8571429 +7355.375552,-378.90625,-271.6964286 +7355.375552,-363.75,-260.5267857 +7355.375552,-348.59375,-249.3392857 +7355.375552,-333.4375,-238.1428571 +7355.375552,-318.28125,-226.9196429 +7355.375552,-303.125,-215.6875 +7355.375552,-287.96875,-204.4464286 +7355.375552,-272.8125,-193.1785714 +7355.375552,-257.65625,-181.9017857 +7355.375552,-242.5,-170.6160714 +7355.375552,-227.34375,-159.3035714 +7355.375552,-212.1875,-147.9821429 +7355.375552,-197.03125,-136.6428571 +7355.375552,-181.875,-125.2946429 +7355.375552,-166.71875,-113.9285714 +7355.375552,-151.5625,-102.5446429 +7355.375552,-136.40625,-91.15178571 +7355.375552,-121.25,-79.7375 +7355.375552,-106.09375,-68.31071429 +7355.375552,-90.9375,-56.86875 +7355.375552,-75.78125,-45.41160714 +7355.375552,-60.625,-33.93928571 +7355.375552,-45.46875,-22.45267857 +7355.375552,-30.3125,-10.95 +7355.375552,-15.15625,0.581044643 +7355.375552,0,12.41339286 +7355.375552,15.15625,24.26160714 +7355.375552,30.3125,36.125 +7355.375552,45.46875,48.00357143 +7355.375552,60.625,59.89821429 +7355.375552,75.78125,71.80714286 +7355.375552,90.9375,83.73214286 +7355.375552,106.09375,95.66964286 +7355.375552,121.25,107.625 +7355.375552,136.40625,119.5982143 +7355.375552,151.5625,131.5803571 +7355.375552,166.71875,143.5803571 +7355.375552,181.875,155.5982143 +7355.375552,197.03125,167.6339286 +7355.375552,212.1875,179.6785714 +7355.375552,227.34375,191.7410714 +7355.375552,242.5,203.8214286 +7355.375552,257.65625,215.9107143 +7355.375552,272.8125,228.0178571 +7355.375552,287.96875,240.1428571 +7355.375552,303.125,252.2857143 +7355.375552,318.28125,264.4375 +7355.375552,333.4375,276.6071429 +7355.375552,348.59375,288.7946429 +7355.375552,363.75,300.9910714 +7355.375552,378.90625,313.2053571 +7355.375552,394.0625,325.4375 +7355.375552,409.21875,337.6875 +7355.375552,424.375,349.9464286 +7355.375552,439.53125,362.2232143 +7355.375552,454.6875,374.5178571 +7355.375552,469.84375,386.8214286 +7355.375552,485,399.1428571 diff --git a/VectoCore/VectoCoreTest/TestData/Hybrids/ElectricMotor/GenericEMotor.vemp b/VectoCore/VectoCoreTest/TestData/Hybrids/ElectricMotor/GenericEMotor.vemp index e5743ea67b050646f310ac028e4a33ba630c8c6c..1df533f1edd2f7d944e7dd09f8fbe9da8197d383 100644 --- a/VectoCore/VectoCoreTest/TestData/Hybrids/ElectricMotor/GenericEMotor.vemp +++ b/VectoCore/VectoCoreTest/TestData/Hybrids/ElectricMotor/GenericEMotor.vemp @@ -1,4 +1,4 @@ -n [rpm] , T_drive [Nm] , T_drag [Nm] +n [rpm] , T_drive [Nm] , T_recuperation [Nm] 0 , 401.07 , -401.07 1600 , 401.07 , -401.07 1665 , 401.07 , -401.07 diff --git a/VectoCore/VectoCoreTest/TestData/Hybrids/ElectricMotor/GenericEMotor240kW.vemp b/VectoCore/VectoCoreTest/TestData/Hybrids/ElectricMotor/GenericEMotor240kW.vemp index d5f1106f86d9de4590e718cbddfe5848057a1398..694f1894340578c273e6dddf9d5612aab11d218b 100644 --- a/VectoCore/VectoCoreTest/TestData/Hybrids/ElectricMotor/GenericEMotor240kW.vemp +++ b/VectoCore/VectoCoreTest/TestData/Hybrids/ElectricMotor/GenericEMotor240kW.vemp @@ -1,4 +1,4 @@ -n [rpm] , T_drive [Nm] , T_drag [Nm] +n [rpm] , T_drive [Nm] , T_recuperation [Nm] 0 , 802.14 , -802.14 1600 , 802.14 , -802.14 1665 , 802.14 , -802.14 diff --git a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs index b91024a86a71fbe70a97e6fcabe542e200e52389..8f469782f351c3e5e3f492965650b89bc79346d9 100644 --- a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs +++ b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs @@ -179,13 +179,14 @@ namespace TUGraz.VectoCore.Tests.Utils return dao.CreateDriverData(engineeringJob.DriverInputData); } - public static List<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMotorData(string file, PowertrainPosition pos) + public static List<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMotorData(string file, int count, + PowertrainPosition pos, double ratio, double efficiency) { var inputData = JSONInputDataFactory.ReadElectricMotorData(file, false); return new EngineeringDataAdapter().CreateElectricMachines(new MockElectricMachinesInputData() { Entries = new[] { new ElectricMachineEntry<IElectricMotorEngineeringInputData>() - { Count = 1, ElectricMachine = inputData, Position = pos } + { Count = count, ElectricMachine = inputData, Position = pos, Ratio = ratio, MechanicalEfficiency = efficiency} } }); } diff --git a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs index f602db41ea5927201c64f1cd3d1a9dbbbe6acec9..3db922ff62a785849db6ea95b2704520e34762fa 100644 --- a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs @@ -385,6 +385,9 @@ namespace TUGraz.VectoCore.Tests.Utils get { throw new NotImplementedException(); } } + public bool HasElectricMotor { get; } + public PowertrainPosition[] ElectricMotorPositions { get; } + #endregion } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj index 1b94f1b0917d1a6093994a86f21911294491b662..2d6840cf78cd0f25ea42431958707d51900bc01a 100644 --- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj +++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj @@ -240,6 +240,21 @@ <SubType>Designer</SubType> </None> <None Include="default.runsettings" /> + <None Include="TestData\BatteryElectric\GenericVehicleB4\GenericBattery_243kWh_750V.vbat"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\BatteryElectric\GenericVehicleB4\GenericDrag_125kW_485Nm.vemd"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\BatteryElectric\GenericVehicleB4\GenericEMotor_125kW_485Nm.vem"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\BatteryElectric\GenericVehicleB4\GenericEMotor_125kW_485Nm.vemp"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\BatteryElectric\GenericVehicleB4\GenericMap_125kW_485Nm.vemo"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> <None Include="TestData\Components\AT_GBX\GearLossMap.vtlm"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None>