diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs index f077fefc392a8c938032d8c729544493c8417a43..41e0fb4be6976c8745d39aa031a137a0ed98bd66 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs @@ -179,9 +179,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl private Second GetStopTimeInterval() { if (!Left.PTOActive || IdleController == null) { - return Left.StoppingTime.IsGreater(3 * Constants.SimulationSettings.TargetTimeInterval) - ? GetStopTimeIntervalThreePhases() - : Left.StoppingTime; + if ((Left.StoppingTime - PreviousState.WaitTime).IsGreater(2 * Constants.SimulationSettings.TargetTimeInterval, + 0.1 * Constants.SimulationSettings.TargetTimeInterval)) { + return 2 * Constants.SimulationSettings.TargetTimeInterval; + } + return Left.StoppingTime - PreviousState.WaitTime; } if (Left.StoppingTime.IsGreater(6 * Constants.SimulationSettings.TargetTimeInterval)) { // 7 phases @@ -196,20 +198,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return IdleController.GetNextCycleTime(); } - private Second GetStopTimeIntervalThreePhases() - { - switch (CurrentState.WaitPhase) { - case 1: - case 3: - CurrentState.WaitPhase++; - return Constants.SimulationSettings.TargetTimeInterval; - case 2: - CurrentState.WaitPhase++; - return Left.StoppingTime - 2 * Constants.SimulationSettings.TargetTimeInterval; - } - return null; - } - private Second GetStopTimeIntervalThreePhasesPTO() { switch (CurrentState.WaitPhase) { @@ -390,8 +378,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// </summary> public double Progress { - get - { + get { return Data.Entries.Count > 0 ? (CurrentState.Distance.Value() - Data.Entries.First().Distance.Value()) / (Data.Entries.Last().Distance.Value() - Data.Entries.First().Distance.Value()) @@ -448,8 +435,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public CycleData CycleData { - get - { + get { return new CycleData { AbsTime = CurrentState.AbsTime, AbsDistance = CurrentState.Distance, @@ -552,4 +538,4 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl CycleIntervalIterator.Dispose(); } } -} \ No newline at end of file +} diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TransmissionComponent.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TransmissionComponent.cs index 2c08505d6d73d5927c310238855929bfe41f7f38..a09be59236b6b63c6a4925add38c61d22207b7b4 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TransmissionComponent.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TransmissionComponent.cs @@ -29,91 +29,91 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Models.Connector.Ports; -using TUGraz.VectoCore.Models.Simulation; -using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; - -namespace TUGraz.VectoCore.Models.SimulationComponent.Impl -{ - public abstract class TransmissionComponent : - StatefulVectoSimulationComponent<TransmissionComponent.TransmissionState>, IPowerTrainComponent, ITnInPort, - ITnOutPort - { - protected ITnOutPort NextComponent; - [ValidateObject] internal readonly TransmissionData ModelData; - - public class TransmissionState : SimpleComponentState - { - public TransmissionLossMap.LossMapResult TorqueLossResult; - //public NewtonMeter TorqueLoss = 0.SI<NewtonMeter>(); - } - - protected TransmissionComponent(IVehicleContainer container, TransmissionData modelData) : base(container) - { - ModelData = modelData; - } - - public virtual ITnInPort InPort() - { - return this; - } - - public virtual ITnOutPort OutPort() - { - return this; - } - - public virtual void Connect(ITnOutPort other) - { - NextComponent = other; - } - - public virtual IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, - bool dryRun = false) - { - Log.Debug("request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity); - - var inAngularVelocity = outAngularVelocity * ModelData.Ratio; - var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0; - - var torqueLossResult = ModelData.LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque); - var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value; - - CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); - CurrentState.TorqueLossResult = torqueLossResult; - - var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun); - return retVal; - } - - public virtual IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity) - { - var inAngularVelocity = outAngularVelocity * ModelData.Ratio; - var torqueLossResult = ModelData.LossMap.GetTorqueLoss(outAngularVelocity, outTorque); - var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value; - - PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); - PreviousState.TorqueLossResult = torqueLossResult; - - return NextComponent.Initialize(inTorque, inAngularVelocity); - } - - protected override void DoCommitSimulationStep() - { - if (CurrentState.TorqueLossResult.Extrapolated) { - Log.Warn("{2} LossMap data was extrapolated: range for loss map is not sufficient: n:{0}, torque:{1}", - CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name); - - if (DataBus.ExecutionMode == ExecutionMode.Declaration) { - throw new VectoException( - "{2} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{0}, torque:{1}", - CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name); - } - } - AdvanceState(); - } - } +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Connector.Ports; +using TUGraz.VectoCore.Models.Simulation; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; + +namespace TUGraz.VectoCore.Models.SimulationComponent.Impl +{ + public abstract class TransmissionComponent : + StatefulVectoSimulationComponent<TransmissionComponent.TransmissionState>, IPowerTrainComponent, ITnInPort, + ITnOutPort + { + protected ITnOutPort NextComponent; + [ValidateObject] internal readonly TransmissionData ModelData; + + public class TransmissionState : SimpleComponentState + { + public TransmissionLossMap.LossMapResult TorqueLossResult; + //public NewtonMeter TorqueLoss = 0.SI<NewtonMeter>(); + } + + protected TransmissionComponent(IVehicleContainer container, TransmissionData modelData) : base(container) + { + ModelData = modelData; + } + + public virtual ITnInPort InPort() + { + return this; + } + + public virtual ITnOutPort OutPort() + { + return this; + } + + public virtual void Connect(ITnOutPort other) + { + NextComponent = other; + } + + public virtual IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, + bool dryRun = false) + { + Log.Debug("request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity); + + var inAngularVelocity = outAngularVelocity * ModelData.Ratio; + var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0; + + var torqueLossResult = ModelData.LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque); + var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value; + + CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); + CurrentState.TorqueLossResult = torqueLossResult; + + var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun); + return retVal; + } + + public virtual IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity) + { + var inAngularVelocity = outAngularVelocity * ModelData.Ratio; + var torqueLossResult = ModelData.LossMap.GetTorqueLoss(outAngularVelocity, outTorque); + var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value; + + PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); + PreviousState.TorqueLossResult = torqueLossResult; + + return NextComponent.Initialize(inTorque, inAngularVelocity); + } + + protected override void DoCommitSimulationStep() + { + if (CurrentState.TorqueLossResult.Extrapolated) { + Log.Warn("{2} LossMap data was extrapolated: range for loss map is not sufficient: n:{0}, torque:{1}", + CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name); + + if (DataBus.ExecutionMode == ExecutionMode.Declaration) { + throw new VectoException( + "{2} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{0}, torque:{1}", + CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name); + } + } + AdvanceState(); + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Utils/XmlResourceResolver.cs b/VectoCore/VectoCore/Utils/XmlResourceResolver.cs index a045a73c78d216d0dccbdd31efac7146745c2657..1a02f713a5016476248c68db9984be726d9ed4fe 100644 --- a/VectoCore/VectoCore/Utils/XmlResourceResolver.cs +++ b/VectoCore/VectoCore/Utils/XmlResourceResolver.cs @@ -29,23 +29,23 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.IO; -using System.Xml; - -namespace TUGraz.VectoCore.Utils -{ - public class XmlResourceResolver : XmlUrlResolver - { - internal const string BaseUri = "schema://"; - - public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) - { - if (absoluteUri.Scheme == "schema") { - return RessourceHelper.LoadResourceAsStream(RessourceHelper.ResourceType.XMLSchema, - Path.GetFileName(absoluteUri.LocalPath)); - } - return base.GetEntity(absoluteUri, role, ofObjectToReturn); - } - } +using System; +using System.IO; +using System.Xml; + +namespace TUGraz.VectoCore.Utils +{ + public class XmlResourceResolver : XmlUrlResolver + { + internal const string BaseUri = "schema://"; + + public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) + { + if (absoluteUri.Scheme == "schema") { + return RessourceHelper.LoadResourceAsStream(RessourceHelper.ResourceType.XMLSchema, + Path.GetFileName(absoluteUri.LocalPath)); + } + return base.GetEntity(absoluteUri, role, ofObjectToReturn); + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs b/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs index fb88222b7bcfbfb2652649d7d72ab80a4d7ac76f..68d4fdb4a97ad5b84b718bc306e6b1e923eb29c6 100644 --- a/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs +++ b/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs @@ -49,10 +49,10 @@ namespace TUGraz.VectoCore.Tests.Integration @"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 0, 0.00040262, 5652.5200, TestName = "Ethanol LH Low"), TestCase(FuelType.DieselCI, - @"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0007971, 10877.1820, + @"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0007971, 10876.9518, TestName = "Diesel LH Ref"), TestCase(FuelType.EthanolCI, - @"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0004660, 6546.6880, + @"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0004660, 6546.5494, TestName = "Ethanol LH Ref"),] public void TestFuelTypesCO2(FuelType fuelType, string jobName, int runIdx, double expectedCo2, double expectedMJ) { @@ -85,4 +85,4 @@ namespace TUGraz.VectoCore.Tests.Integration Assert.AreEqual(expectedMJ, modContainer.EnergyPerMeter().Value(), 1e-3); } } -} \ No newline at end of file +} diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/DistanceBasedDrivingCycleTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/DistanceBasedDrivingCycleTest.cs index 275c94e069756dfec1201747e08916cb1aa48222..13b6120e445d441141237530baff6eb69544b180 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/DistanceBasedDrivingCycleTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/DistanceBasedDrivingCycleTest.cs @@ -164,30 +164,19 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var startDistance = container.CycleStartDistance.Value(); var absTime = 0.SI<Second>(); - // waiting time of 40 seconds is split up to 3 steps: 0.5, 39, 0.5 - var response = cycle.OutPort().Request(absTime, 1.SI<Meter>()); - Assert.IsInstanceOfType(response, typeof(ResponseSuccess)); - Assert.AreEqual(0, driver.LastRequest.TargetVelocity.Value(), Tolerance); - Assert.AreEqual(0.028416069495827, driver.LastRequest.Gradient.Value(), 1E-12); - Assert.AreEqual(0.5, driver.LastRequest.dt.Value(), Tolerance); - container.CommitSimulationStep(absTime, response.SimulationInterval); - absTime += response.SimulationInterval; - response = cycle.OutPort().Request(absTime, 1.SI<Meter>()); - Assert.IsInstanceOfType(response, typeof(ResponseSuccess)); - Assert.AreEqual(0, driver.LastRequest.TargetVelocity.Value(), Tolerance); - Assert.AreEqual(0.028416069495827, driver.LastRequest.Gradient.Value(), 1E-12); - Assert.AreEqual(39, driver.LastRequest.dt.Value(), Tolerance); - container.CommitSimulationStep(absTime, response.SimulationInterval); - absTime += response.SimulationInterval; + IResponse response; - response = cycle.OutPort().Request(absTime, 1.SI<Meter>()); - Assert.IsInstanceOfType(response, typeof(ResponseSuccess)); - Assert.AreEqual(0, driver.LastRequest.TargetVelocity.Value(), Tolerance); - Assert.AreEqual(0.028416069495827, driver.LastRequest.Gradient.Value(), 1E-12); - Assert.AreEqual(0.5, driver.LastRequest.dt.Value(), Tolerance); - container.CommitSimulationStep(absTime, response.SimulationInterval); - absTime += response.SimulationInterval; + // waiting 40s in 1s steps + for (var i = 0; i < 40; i++) { + response = cycle.OutPort().Request(absTime, 1.SI<Meter>()); + Assert.IsInstanceOfType(response, typeof(ResponseSuccess)); + Assert.AreEqual(0, driver.LastRequest.TargetVelocity.Value(), Tolerance); + Assert.AreEqual(0.028416069495827, driver.LastRequest.Gradient.Value(), 1E-12); + Assert.AreEqual(1, driver.LastRequest.dt.Value(), Tolerance); + container.CommitSimulationStep(absTime, response.SimulationInterval); + absTime += response.SimulationInterval; + } response = cycle.OutPort().Request(absTime, 1.SI<Meter>()); @@ -231,4 +220,4 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent absTime += response.SimulationInterval; } } -} \ No newline at end of file +}