From b0e498f22ff64144851e2224e9dcf47b6ac4d69a Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Wed, 22 Jul 2020 16:06:26 +0200 Subject: [PATCH] allowing multiple electric motors at a single position - combine full-load curve, drag curve and map accordingly, new parameter mechancial efficiency calculate max vehicle speed for BEVs adapt driver strategy to handle BEVs added testcase and new model data for BEV tests --- .../InputData/DeclarationInputData.cs | 4 + .../VectoCommon/Models/PowertrainPosition.cs | 6 + .../ElectricFullLoadCurveReader.cs | 14 +- .../ComponentData/ElectricMotorMapReader.cs | 20 +- .../EngineeringDataAdapter.cs | 16 +- .../Simulation/Data/ModalResultField.cs | 7 +- .../Models/Simulation/DataBus/IDataBus.cs | 4 +- .../Simulation/DataBus/IElectricMotorInfo.cs | 2 + .../Simulation/Impl/VehicleContainer.cs | 5 + .../Data/ElectricMotor/EfficiencyMap.cs | 10 + .../Data/ElectricMotor/ElectricMotorData.cs | 1 + .../Impl/DefaultDriverStrategy.cs | 17 +- .../SimulationComponent/Impl/ElectricMotor.cs | 12 +- .../SimulationComponent/Impl/Vehicle.cs | 40 +- .../FileIO/JsonReadHybridTest.cs | 42 +- .../BatteryElectric/BatteryElectricTest.cs | 281 ++- .../Integration/Hybrid/ParallelHybridTest.cs | 32 +- .../ElectricMotorEfficienyMapTest.cs | 8 +- .../GenericBattery_243kWh_750V.vbat | 30 + .../GenericDrag_125kW_485Nm.vemd | 3 + .../GenericEMotor_125kW_485Nm.vem | 17 + .../GenericEMotor_125kW_485Nm.vemp | 74 + .../GenericMap_125kW_485Nm.vemo | 2016 +++++++++++++++++ .../Hybrids/ElectricMotor/GenericEMotor.vemp | 2 +- .../ElectricMotor/GenericEMotor240kW.vemp | 2 +- .../Utils/MockSimulationDataFactory.cs | 5 +- .../Utils/MockVehicleContainer.cs | 3 + VectoCore/VectoCoreTest/VectoCoreTest.csproj | 15 + 28 files changed, 2598 insertions(+), 90 deletions(-) create mode 100644 VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericBattery_243kWh_750V.vbat create mode 100644 VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericDrag_125kW_485Nm.vemd create mode 100644 VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericEMotor_125kW_485Nm.vem create mode 100644 VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericEMotor_125kW_485Nm.vemp create mode 100644 VectoCore/VectoCoreTest/TestData/BatteryElectric/GenericVehicleB4/GenericMap_125kW_485Nm.vemo diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index 666f6eba35..c175cab3cf 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 51e06d7a3a..dbe59c40a8 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 b4bf0ad645..e95884d2d7 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 4ef6d383ac..27bb374a26 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 041a466204..6fd194084f 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 b54c4c8e5b..3c5854615f 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 4f85633b7c..d590da8402 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 75bf5cfab8..2398bcf773 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 b89f881ed2..112c9aefd9 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 21fde2ab14..c0ccf72a35 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 d8df6bc655..ff4b449e6e 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 cffac5072d..75fae046fa 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 7645f3f575..dd7b499ad2 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 ec468055d9..c49fbb05b5 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 8f88fdd002..4a1811d3ca 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 8265e7b93c..fa9f3f26b7 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 f70636bc6b..07a35a262f 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 bb7f288fd0..d23702ed40 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 0000000000..fd92ed38b9 --- /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 0000000000..5345f4d143 --- /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 0000000000..c0a57a974a --- /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 0000000000..2d3d1f8b59 --- /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 0000000000..972a8b6ac4 --- /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 e5743ea67b..1df533f1ed 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 d5f1106f86..694f189434 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 b91024a86a..8f469782f3 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 f602db41ea..3db922ff62 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 1b94f1b091..2d6840cf78 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> -- GitLab